UTF-8には、BOM付きとBOM無しがあります。
BOM(バイトオーダーマーク)とは、「このファイルはUTF-8(とか)で作られてるよ~」のマークです。
メモ帳等で開くと、BOMが直接見えるわけではないですが、ファイルの先頭にこっそりマークされています。
BOM無しでも構いません。ただし、BOM無しの場合、正しく文字コードが認識されない場合があります。
BOMが無いと、テキストエディタ等は「なんとなくこれかな?」といった感じで文字コードを推測して開くため、誤ってSJISで認識されたりして文字化けすることがあります。
例えばUTF-8 BOM無しのCSVファイルをExcelで開くと・・・
しっかり文字化けしてくれます(; ・`д・´)
そんなこんなで、何か理由がない限り、BOMを付けておく方が無難ですw
Youtube版はこちらからどうぞ
Youtubeで動画を公開しました。こちらもぜひぜひ。
こちらは、CSVファイルの出力で対策した例になってます。
ついでにBOM有無のバイナリ比較もあります。
テキストファイルをUTF-8で作成するときにBOMをつけるサンプル
UTF-8でテキストファイルを作成する際に、BOMを付加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.OutputStreamWriter; public class Utf8BomTest { public static void main(String[] args) { try(FileOutputStream fos = new FileOutputStream("c:\\test\\test.txt"); OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); BufferedWriter bw = new BufferedWriter(osw)) { //BOM付与 fos.write(0xef); fos.write(0xbb); fos.write(0xbf); bw.write("カキカキ...( ..);φメモメモ"); bw.flush(); }catch(Exception e) { e.printStackTrace(); } } } |
実行結果
C:\test\test.txtに「カキカキ…( ..);φメモメモ」が出力されます。
BOMが出力されたかどうかは、テキストエディタ等で以下のように確認できます。
ちなみに、BOM無しだとこんな感じです。
(見づらいかもしれませんが、ステータスバーに「UTF-8 BOM付」、「UTF-8」が出ています)
サンプルの解説
UTF-8のBOMは、ファイルの先頭3byteに持っています。
よって、先頭3byteに、「0xef」、「0xbb」、「0xbf」を埋め込んであげることで、UTF-8 BOM付きファイルができあがります。
以降は、いつもどおり、普通に中身を書いてあげればOKです。
その他、UTF-8以外でも、UNICODE系の文字コードでは、UTF-7,UTF-16等それぞれにBOMがあります。