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


JAVAでUTF-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からの読込をするほうに全て実装してしまってもよいかもしれない。