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!