28
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Javaで文字コード簡易判定

Last updated at Posted at 2014-07-11

バイト配列として与えられた入力文字列が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初心者の私は嵌りました :sweat_smile:

自分の興味分野では文字コード不明の文字列はbyte[]で渡されてくるので(FileInputStreamとかjniでC文字列とか)本来SJISで扱うべきものがUnicodeのはずのStringに無理やり突っ込まれて渡されてくる、という状況がよくわからず。どういう時にあるんでしょ?
思うにJavaでUTF-8の文字コードを判定するは文字コードの判定法ではなく文字化けしているかどうかの判定法だと思うんですが……

28
32
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?