ホームページ >Java >&#&ベース >Java でクエリされたデータを CSV ファイルとしてエクスポートすると文字化けが発生する

Java でクエリされたデータを CSV ファイルとしてエクスポートすると文字化けが発生する

王林
王林オリジナル
2019-12-04 15:46:412515ブラウズ

Java でクエリされたデータを CSV ファイルとしてエクスポートすると文字化けが発生する

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。