Maison >Java >JavaBase >Des caractères tronqués apparaissent lors de l'exportation des données interrogées sous forme de fichier CSV en Java

Des caractères tronqués apparaissent lors de l'exportation des données interrogées sous forme de fichier CSV en Java

王林
王林original
2019-12-04 15:46:412515parcourir

Des caractères tronqués apparaissent lors de l'exportation des données interrogées sous forme de fichier CSV en Java

1. Problèmes

Lorsque les données interrogées sont exportées sous forme de fichier xls (encodage UTF-8), les données sont normales mais lorsqu'elles sont exportées sous forme de fichier xls. Fichier CSV, les caractères chinois tronqués sont également codés en UTF-8. Lorsqu'ils sont exportés en codage GBK, l'affichage chinois est normal.

Je pensais que le problème était résolu. Lorsque j'ai exporté ultérieurement des données contenant des caractères latins (tels que ÀÆÊàÌ), les données exportées sous forme de fichier xls s'affichaient normalement. Lors de l'exportation sous forme de fichier CSV, les caractères latins du fichier. Le fichier était affiché sous la forme "?".

Tutoriels vidéo recommandés : Cours Java

2 Solution

Le fichier exporté en mode CSV ne contient pas d'informations de nomenclature par défaut. être résolu en définissant l'identifiant de nomenclature (flux d'octets commençant par EF BB BF) pour le contenu à sortir.

La méthode spécifique est la suivante :

...
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(response.getOutputStream(), "UTF-8");  
// 要输出的内容  
result = (String)contentMap.get(RESPONSE_RESULT);  
response.setHeader("Content-Disposition", "attachment;filename=test.csv");  
outputStreamWriter.write(new String(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF}));  
outputStreamWriter.write(result);  
outputStreamWriter.flush();

Si elle est implémentée avec le flux OutputStream, les paramètres peuvent être modifiés comme suit :

out = response.getOutputStream();     
//加上UTF-8文件的标识字符      
out.write(new byte []{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF});

Remarque :

BOM : Byte Order Mark, marque d'ordre d'octet (ce qui suit est tiré de l'Encyclopédie Baidu)

Dans l'encodage UCS, il existe un code appelé "Zero width No-Break Space", qui est traduit en chinois par le caractère "Zero width No-Break Space", son codage est FEFF. FFFE est un caractère qui n'existe pas dans UCS, il ne devrait donc pas apparaître dans la transmission réelle.

La spécification UCS recommande de transmettre les caractères « Zero width No-Break Space » avant de transmettre le flux d'octets, de sorte que si le récepteur reçoit FEFF, cela signifie que le flux d'octets est Big-Endian s'il reçoit FFFE ; indique que le flux d'octets est Little-Endian.

Ainsi, le caractère "Zero width No-Break Space" est également appelé BOM.

UTF-8 ne nécessite pas de nomenclature pour indiquer l'ordre des octets, mais peut utiliser une nomenclature pour indiquer l'encodage. Le codage UTF-8 du caractère « Zero width No-Break Space » est EF BB BF. Ainsi, si le récepteur reçoit un flux d'octets commençant par EF BB BF, il sait qu'il est codé en UTF-8.

Windows utilise BOM pour marquer la méthode d'encodage des fichiers texte.

Articles et tutoriels connexes recommandés : Commencer à apprendre Java

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