rm /blog

IT系技術職のおっさんがIT技術とかライブとか日常とか雑多に語るブログです。* 本ブログに書かれている内容は個人の意見・感想であり、特定の組織に属するものではありません。/All opinions are my own.*

【JAVA】BOM(Byte Of Mark)の手動除去ロジック

JAVAUTF-8のファイルからBOM(Byte Of Mark)を取り除く方法。
ググればでてくるが自分用のメモ。

BOMはUnicodeでの文字コードが「Uxfeff」で定義されている。
通常テキストファイルの「先頭」に位置しているので、
ファイルから読み込んだ文字列の1文字目のコードを判定して「0xfeff」だったら取り除く、
とすればよいだけ。
private static String excludeBOMString(String original_str) {
	if (original_str != null) {
		char c = original_str.charAt(0);
		if (Integer.toHexString(c).equals("feff")) {
			StringBuilder sb = new StringBuilder();
			for (int i=1; i < original_str.length(); i++) {
				sb.append(original_str.charAt(i));
			}
			return sb.toString();
		} else {
			return original_str;
		}
	} else {
		return "";
	}
}
ただ、これは単に「文字列先頭の0xfeffを除く」というロジックなので、
「テキストファイルの先頭の0xfeffを取り除く」を的確に実現するものではない。
つまり「テキストファイルの先頭の」という判断はメソッドを呼ぶ側にゆだねられている。
こんな風に↓
int rec = 0;
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("test.txt"),"UTF-8")));
while(br.ready()) {
	String line = br.readLine();
	// 1行目ならBOM除去メソッドを呼び出す
	if (rec == 0) {
		line = excludeBOMString(line);
	}
	
	rec++;
}
この程度ならBufferedReaderからの読込をするほうに全て実装してしまってもよいかもしれない。