我们所有基于文本的文件都是以UTF-8或latin-1(Windows)编码。我们唯一使用的“特殊字符”是德语umlautsä,ö,ü和ß。
由于不同的原因(包括历史原因,但也包括“属性文件不能是UTF-8”的旧问题),我们无法完全统一我们的编码。
当人们在Java中读取文本文件并使用错误的编码时,这显然会导致错误。
如果您知道可能的特殊字符仅限于上述字符,是否有一种简单可靠的方法来检测文件是UTF-8还是latin-1?
还是我需要将文件读取为字节数组并搜索特殊字节?
我们所有基于文本的文件都是以UTF-8或latin-1(Windows)编码。我们唯一使用的“特殊字符”是德语umlautsä,ö,ü和ß。
由于不同的原因(包括历史原因,但也包括“属性文件不能是UTF-8”的旧问题),我们无法完全统一我们的编码。
当人们在Java中读取文本文件并使用错误的编码时,这显然会导致错误。
如果您知道可能的特殊字符仅限于上述字符,是否有一种简单可靠的方法来检测文件是UTF-8还是latin-1?
还是我需要将文件读取为字节数组并搜索特殊字节?
如果只有 "ä、ö、ü 和 ß" 这些非 ASCII 字符,那么你可以利用它们在 UTF-8 中的第一个代码是 195 (-61 作为一个字节) 的事实。字符 195 在 ISO 8859 中是 Ã
,显然你不希望找到它。
因此,一个解决方案可能是这样的:
public static String readFile(Path p) throws IOException {
byte[] bytes = Files.readAllBytes(p);
boolean isUtf8 = false;
for (byte b : bytes) {
if (b == -61) {
isUtf8 = true;
break;
}
}
return new String(bytes, isUtf8 ? StandardCharsets.UTF_8 : StandardCharsets.ISO_8859_1);
}
myText.matches(".*[äöüß].*")
。 - Youcef LAIDANI