Heim >Java >JavaBase >Einführung in die Lösung für von Java exportierte verstümmelte CSV-Dateien

Einführung in die Lösung für von Java exportierte verstümmelte CSV-Dateien

尚
Original
2019-12-04 10:41:153531Durchsuche

Einführung in die Lösung für von Java exportierte verstümmelte CSV-Dateien

1. Problem

Wenn die abgefragten Daten als XLS-Datei (UTF-8-Kodierung) exportiert werden, sind die Daten normal; CSV-Datei, die Daten in der Datei sind verstümmelte chinesische Zeichen, die auch in UTF-8 kodiert sind. Beim Export in GBK-Kodierung ist die chinesische Anzeige normal.

Ich dachte, das Problem sei gelöst, als ich später Daten mit lateinischen Zeichen (z. B. ÀÆÊàÌ) exportierte, wurden die als XLS-Datei exportierten Daten normal angezeigt Datei wurden als „?“ angezeigt.

Ich habe versucht, auf andere Kodierungsmethoden umzusteigen, aber es hat nicht funktioniert. Ich habe online eine Lösung für dieses Problem gefunden.

2. Lösung

Die im CSV-Modus exportierte Datei enthält standardmäßig keine Stücklisteninformationen (Byte-Stream beginnend mit EF BB BF) für den auszugebenden Inhalt. Das heißt, dieses Problem kann gelöst werden. Die spezifische Methode lautet wie folgt: (Empfohlen: Java-Video-Tutorial)

...
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();

Wenn sie mit dem OutputStream-Stream implementiert wird, können die Parameter wie folgt geändert werden:

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

Hinweis:

BOM: Byte Order Mark, Byte Order Mark (das Folgende stammt aus der Baidu-Enzyklopädie)

In der UCS-Codierung gibt es einen Code namens „Zero Width No-Break Space“, was ins Chinesische als „Zero-Width No-Break Space“-Zeichen übersetzt wird, seine Kodierung ist FEFF. FFFE ist ein Zeichen, das in UCS nicht existiert und daher in der tatsächlichen Übertragung nicht vorkommen sollte.

Die UCS-Spezifikation empfiehlt, dass wir vor der Übertragung des Bytestreams die Zeichen „Zero Width No-Break Space“ übertragen. Wenn der Empfänger FEFF empfängt, zeigt er auf diese Weise an, dass der Bytestrom Big-Endian ist. Wenn er FFFE empfängt, zeigt er an, dass der Bytestrom Little-Endian ist. Daher wird das Zeichen „Zero Width No-Break Space“ auch BOM genannt.

UTF-8 erfordert keine BOM zur Angabe der Bytereihenfolge, kann jedoch eine BOM zur Angabe der Codierung verwenden. Die UTF-8-Kodierung für das Zeichen „Zero Width No-Break Space“ ist EF BB BF. Wenn der Empfänger also einen Bytestrom empfängt, der mit EF BB BF beginnt, weiß er, dass dieser UTF-8-codiert ist. Windows verwendet BOM, um die Kodierung von Textdateien zu markieren.

Weitere Java-Kenntnisse finden Sie in der Spalte Java Basic Tutorial.

Das obige ist der detaillierte Inhalt vonEinführung in die Lösung für von Java exportierte verstümmelte CSV-Dateien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn