へっぽこITエンジニア@名古屋のブログ

Follow me on GitHub

Javaの標準出力にBOMを追加

ファイル作成時にBOMをつける方法は、
色々サイトに書いてあって OutputStream0xef,0xbb,0xbfをwriteすればよいです。
具体的な情報は参考に張っておきます。

ただ今回は、CSVファイル形式のデータを
サーバ経由でUTF-8でレスポンスが返ってくるので
それを標準出力としてリダイレクトするという制約がありました(*‘▽’)

なんでこんなまどろっこしいことするかは置いといて、
BOMなしのUTF-8のCSVファイルはExcelで開くと日本語が文字化けします。

ですので、BOM付きのファイルを読み込んで、BOMを取り除くプログラムを参考に
逆にBOMをStringに追加するプログラムを書いてみました。 結果として、Excelで文字化けしないようになりました(‘ω’)

↓ strからBOMを付加してresultを作成

byte[] b = str.getBytes();
byte[] n = new byte[b.length + 3];
n[0] = -17;
n[1] = -69;
n[2] = -65;
for(int i=3,k=0; i < n.length; i++, k++){
  n[i] = b[k];
}
String result = new String(n);

頭の3バイトにBOMを足してその後は元の文字列を足していく感じです。

そもそも、CSVじゃなくてjsonじゃないのとか
色々突っ込みどころ満載でしょうが、
まだまだCSVが好きなんですよね~

環境にもよると思いますが、上記のプログラムをjavaコマンドで動かすときは
-Dfile.encoding=UTF-8のオプションがいるかもですね。
Windowsなら(`・ω・´)キリ

参考サイト

Java で操作するUTF-8エンコードのCSVに BOMを付ける。
Java UTF-8のテキストファイルをBOM付きで作成する

作成日:2021-05-18  更新日:2021-05-19