Javaでバイト列を文字列に変換しようとすると、変換できない箇所は決まった文字に置き換えられます。
CharsetDecodeを使うとその動作を変更でき、決まった文字で置き換えるのではなく例外を飛ばすようにすることで文字コードのチェックが行えます。
package com.example;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CodingErrorAction;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Example {
public static void main(String[] args) throws IOException {
Path pathUTF8 = Paths.get("utf8.txt");
Path pathSJIS = Paths.get("shift-jis.txt");
System.out.println(isUTF8(Files.readAllBytes(pathUTF8)));
System.out.println(isUTF8(Files.readAllBytes(pathSJIS)));
}
public static boolean isUTF8(byte[] bytes) {
try {
CharsetDecoder charsetDecoder = StandardCharsets.UTF_8
.newDecoder()
.onMalformedInput(CodingErrorAction.REPORT)
.onUnmappableCharacter(CodingErrorAction.REPORT);
charsetDecoder.decode(ByteBuffer.wrap(bytes));
} catch (CharacterCodingException e) {
return false;
}
return true;
}
}