CSVファイルの文字化けをエクスポート

1596 ワード

問題の概要
今のAUTはcsvファイルをエクスポートする機能がかなり一般的になりましたが、ファイルを開くと文字化けして表示されることも珍しくありません.符号化時にわざわざコード表をUTF-8と指定しても、下記のようになります.
public void exportCSV(){
	OutputStreamWriter fwriter = new OutputStreamWriter(
		new FileOutputStream(new File("csv/export.csv")), "UTF-8");  
	  	  
	ICsvBeanWriter writer = new CsvBeanWriter(fwriter, 
		CsvPreference.EXCEL_PREFERENCE);  
…
}
コード表を指定したのに、なぜExcelでUTF-8符号化のCSVファイルを開けたら、内容は相変わらず文字化けですか?なぜかというと、Excel自体はデフォルトではANSI形式で開き、符号認識をしないからです.
回避手段
このような状況に対して、最も簡潔な回避手段を採用することができます.
1.    エクセルを開く
2.    DATA->From Textを選択します.
3.    UTF-8符号化CSVファイルを選択し、テキストインポートウィザードImportが現れます.
4.    Delimited->Nextを選択します.
5.    Commmaにチェックをつけて、Tab->Nextを削除します.
6.    最後にクリックしてください.
一番簡単なのは、devが必要ではないので、コードを変えて目的を達成することができます.しかし、これはあくまでもソロではなく一つのworkoundと呼ぶべきです.
ソリューション
この問題を徹底的に解決するためには、BOMというものを導入し、その定義について、wikiさんはこう言います.
バイト順表記(英語:byte-order mark,BOM)は、コードポイントU+FEFFに位置する統一コード文字の名前です.この文字は、UTF-16またはUTF-32でUCS/統一コード文字からなる文字列を符号化するときに使用される.表示ファイルとしてよく使われるのはUTF-8、UTF-16、またはUTF-32で符号化された記号です.
 
コードを修正して、CSVファイルをエクスポートする時、include BOMを導入して、CSVファイルの内容を再度確認します.これで、徹底的に文字化けしてbye byeと言えるでしょう.
// Include the byte order mark (BOM) for UTF-8 encoding.
private function includeBOM(value:String):ByteArray {
	var byteArray:ByteArray = new ByteArray();
	byteArray.writeByte(0xEF);
	byteArray.writeByte(0xBB);
	byteArray.writeByte(0xBF);
	byteArray.writeUTFBytes(value);
	return byteArray;
}