Maison  >  Article  >  Java  >  Raisons et solutions pour les caractères tronqués exportés de Java vers Excel

Raisons et solutions pour les caractères tronqués exportés de Java vers Excel

尚
original
2019-11-29 10:37:146974parcourir

Raisons et solutions pour les caractères tronqués exportés de Java vers Excel

Erreur et manière correcte d'exporter Java : (Recommandé : tutoriel vidéo Java)

错误方式:
response.setHeader("Content-Disposition", "inline;filename="+ new String(fileName.getBytes(),"utf-8"));
String fileName =    aicaseNodeDeptService.getFilename(request)+".xlsx";
 
response.setCharacterEncoding("UTF-8");
response.setContentType("application/ms-excel");
正确的方式:
response.setHeader("Content-Disposition",
        "inline;filename="+
                new String(fileName.getBytes("utf-8"),"iso8859-1"));

Raison : httpheader exige que son contenu soit iso8859 - 1 encodage, après avoir transmis ces caractères à la destination, le programme de destination utilise la méthode inverse Strings_utf8 = newString(s_iso88591.getBytes("ISO8859-1"),"UTF-8") pour obtenir les caractères chinois corrects" ", ce non seulement garantit le respect de l'accord, mais soutient également la langue chinoise.

En Java, la méthode getBytes() de String consiste à obtenir un tableau d'octets dans le format d'encodage par défaut du système d'exploitation. Cela signifie que sous différents systèmes d'exploitation, les éléments renvoyés sont différents ! La méthode

String.getBytes(Stringdecode) renverra la représentation sous forme de tableau d'octets d'une certaine chaîne dans l'encodage en fonction de l'encodage de décodage spécifié, tel que :

byte[] b_gbk = "中".getBytes("GBK");
byte[] b_utf8 = "中".getBytes("UTF-8");
byte[] b_iso88591 = "中".getBytes("ISO8859-1");

renverra la représentation sous forme de tableau d'octets du caractère chinois "中" en codage GBK, UTF-8 et ISO8859-1 respectivement. À l'heure actuelle, la longueur de

b_gbk est de 2, et

La longueur de b_utf8 est 3, et la longueur de

b_iso88591 est 1.

Contrairement à getBytes, vous pouvez restaurer le caractère "中" via new String(byte[], decode).

Cette nouvelle String(byte[], decode) utilise en fait le. décodage d'encodage spécifié pour analyser l'octet[] dans une chaîne

String s_gbk = new String(b_gbk,"GBK");
String s_utf8 = new String(b_utf8,"UTF-8");
String s_iso88591 = new String(b_iso88591,"ISO8859-1");

En produisant s_gbk, s_utf8 et s_iso88591, vous constaterez que s_gbk et s_utf8 sont tous deux "moyens", et seuls s_iso88591 ne sont pas reconnus (can. être compris comme des caractères tronqués), pourquoi le mot « 中 » ne peut-il pas être restauré après avoir utilisé l'encodage et la recombinaison ISO8859-1 ? La raison est très simple, car la table d'encodage ISO8859-1 ne contient pas du tout de caractères chinois. Bien sûr, il est impossible d'obtenir le caractère "中" correct dans ISO8859-1 via "中".getBytes("ISO8859). -1"); La valeur encodée est déjà là, il est donc impossible de la restaurer via newString().

Par conséquent, lors de l'obtention de byte[] via la méthode String.getBytes(Stringdecode), vous devez vous assurer que la valeur de code représentée par String existe réellement dans la table d'encodage de décodage, afin que le tableau byte[] obtenu peut être restauré correctement.

Remarque :

Parfois, afin d'adapter les caractères chinois à certaines exigences particulières (comme l'en-tête http exigeant que son contenu soit encodé iso8859-1), les caractères chinois peuvent être codés en octets format Pour coder la situation, telle que :

String s_iso88591 = newString("中".getBytes("UTF-8"),"ISO8859-1"), la chaîne s_iso8859-1 ainsi obtenue est en fait trois Pour les caractères ISO8859-1, après avoir transmis ces caractères à la destination, le programme de destination utilise la méthode opposée Strings_utf8 = newString(s_iso88591.getBytes("ISO8859-

Pour plus de connaissances Java, veuillez faire attentionTutoriel de base de Javacolonne

.

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