バイト配列として与えられた入力文字列がUTF8かどうかの判定をしたくてググったら割と上位に出てきた
JavaでUTF-8の文字コードを判定する
を参考にさせてもらって色々やっていたのですが上手くいかなかったので、上手くいった自分のコードを投稿。
考え方は一緒でとりあえず目的の文字コードでString(Unicode)に変換して更にgetBytesで元に戻した時バイト配列が一致するかどうかで正しく変換できていたのかどうかを判定して、正しく変換できていたのならその文字コードなのだろう、というやり方。
もちろんASCII文字列だった場合はどっちもtrueを返します。
public static boolean isUTF8(byte[] src)
{
try {
byte[] tmp = new String(src, "UTF8").getBytes("UTF8");
return Arrays.equals(tmp, src);
}
catch(UnsupportedEncodingException e) {
return false;
}
}
public static boolean isSJIS(byte[] src)
{
try {
byte[] tmp = new String(src, "Shift_JIS").getBytes("Shift_JIS");
return Arrays.equals(tmp, src);
}
catch(UnsupportedEncodingException e) {
return false;
}
}
当初参考にしていた上記記事ではinputTextByte.equals(sjisenc);
とequalsメンバメソッドを使っていたので、byte[]の比較にもそれを使ったら常にfalseが返ってきてJava初心者の私は嵌りました
自分の興味分野では文字コード不明の文字列はbyte[]で渡されてくるので(FileInputStreamとかjniでC文字列とか)本来SJISで扱うべきものがUnicodeのはずのStringに無理やり突っ込まれて渡されてくる、という状況がよくわからず。どういう時にあるんでしょ?
思うにJavaでUTF-8の文字コードを判定するは文字コードの判定法ではなく文字化けしているかどうかの判定法だと思うんですが……