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