Maison  >  Article  >  Java  >  Solution au code tronqué GBK vers UTF-8 en Java

Solution au code tronqué GBK vers UTF-8 en Java

angryTom
angryTomoriginal
2020-02-10 10:53:478432parcourir

Solution au code tronqué GBK vers UTF-8 en Java

Solution pour le code tronqué GBK vers UTF-8 en Java

Si vous utilisez l'encodage GBK, l'autre partie obtiendra l'encodage UTF-8 . Lors de l'envoi de données, vous devez convertir les données codées GBK en données codées UTF-8 afin que l'autre partie ne soit pas tronquée.

Le problème se pose : Lors de la conversion de GBK en UTF-8, les nombres impairs de caractères chinois seront tronqués, mais les nombres pairs de caractères chinois ne le seront pas.

Analyse des causes :

public static void analyze() throws UnsupportedEncodingException {
String gbk = "我来了";
String utf8 = new String(gbk.getBytes("UTF-8"));
for (byte b : gbk.getBytes("UTF-8")) {
System.out.print(b + " ");
}
System.out.println();
for (byte b : utf8.getBytes()) {
System.out.print(b + " ");
}
}
/*
-26 -120 -111 -26 -99 -91 -28 -70 -122
-26 -120 -111 -26 -99 -91 -28 -70 63 !
*/

Notez que le dernier octet est différent, la ligne ci-dessus est le codage UTF-8 correct. Alors pourquoi le dernier octet de la ligne suivante est-il 63 au lieu de -122 ? C’est ce qui provoque le charabia.

L'encodage GBK est de 2 octets en chinois, tandis que l'encodage UTF-8 est de 3 octets en chinois. Lorsque nous appelons la méthode getBytes("UTF-8"), les octets seront ajoutés par calcul, passant de 2. octets en GBK à 3 octets correspondant à UTF-8. Par conséquent, les trois caractères chinois de l’exemple ci-dessus génèrent 9 octets.

(Partage de didacticiels vidéo associés : tutoriel vidéo Java)

Résoudre le problème

S'assurer que les octets sont corrects est le dernier mot. Lorsque vous appelez getBytes("UTF-8") pour convertir en tableau d'octets, créez une chaîne codée ISO-8859-1. Le codage ISO-8859-1 signifie qu'un octet correspond à un caractère, donc le dernier octet ne sera pas modifié. . erreur.

public static void correctEncode() throws UnsupportedEncodingException {
String gbk = "我来了";
String iso = new String(gbk.getBytes("UTF-8"),"ISO-8859-1");
for (byte b : iso.getBytes("ISO-8859-1")) {
System.out.print(b + " ");
}
System.out.println();
//模拟UTF-8编码的网站显示
System.out.println(new String(iso.getBytes("ISO-8859-1"),"UTF-8"));
}
/*
-26 -120 -111 -26 -99 -91 -28 -70 -122
我来了
*/

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn