1. 問題
クエリされたデータが xls ファイル (UTF-8 エンコーディング) としてエクスポートされる場合、データは正常ですが、 CSV ファイルでは、中国語の文字化けも UTF-8 でエンコードされており、GBK エンコードでエクスポートすると正常に中国語表示されます。
問題は解決したと思ったのですが、後からラテン文字(「ÀÆÊàÌ」など)を含むデータをエクスポートしたところ、xlsファイルでエクスポートすると正常に表示されましたが、CSVファイルでエクスポートすると、ラテン文字が表示されなくなりました。ファイルは「?」と表示されました。
他のエンコード方法に変更しようとしてもうまくいきませんでした。この問題の解決策をオンラインで見つけました。
2. 解決策
CSVモードでエクスポートしたファイルには、デフォルトではBOM情報が含まれていないため、出力する内容にBOM識別子(EF BB BFで始まるバイトストリーム)を設定することで、つまり、この問題は解決できます。具体的な方法は次のとおりです。 (推奨: java ビデオ チュートリアル )
... 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();
OutputStream ストリームで実装する場合、パラメータは次のように変更できます。注:
BOM: バイト オーダー マーク、バイト オーダー マーク (以下は百度百科事典から引用)
UCS エンコーディングには、「ゼロ幅ノーブレーク スペース」と呼ばれるものがあります。中国語の翻訳は「ゼロ幅ブレークスペースなし」文字で、エンコードはFEFFです。 FFFE は UCS には存在しない文字ですので、実際の送信では出現しないはずです。
UCS 仕様では、バイト ストリームを送信する前に「Zero width No-Break Space」という文字を送信することが推奨されています。このように、受信機が FEFF を受信した場合、バイト ストリームがビッグ エンディアンであることを示し、FFFE を受信した場合、バイト ストリームがリトル エンディアンであることを示します。したがって、「ゼロ幅ノーブレークスペース」という文字は BOM とも呼ばれます。
UTF-8 ではバイト順序を示すために BOM は必要ありませんが、BOM を使用してエンコード方式を示すことができます。 「ゼロ幅改行スペース」という文字の UTF-8 エンコーディングは EF BB BF です。したがって、受信側が EF BB BF で始まるバイト ストリームを受信すると、それが UTF-8 でエンコードされていることを認識します。 Windows は、BOM を使用してテキスト ファイルのエンコーディングをマークします。
Java についてさらに詳しく知りたい場合は、
Java 基本チュートリアル以上がJavaでエクスポートしたCSVが文字化けした場合の解決方法の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。