编码不可知的方式来读取 "German" 文本文件
Encoding agnostic way to read "German" text files
我们所有基于文本的文件均采用 UTF-8 或 latin-1 (Windows) 编码。我们唯一使用的 "special characters" 是德语变音符号 ä、ö、ü 和 ß。
由于各种原因(包括历史原因,也包括"properties files cannot be 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);
}
这当然很脆弱,如果文件包含其他特殊字符,将无法正常工作。
我们所有基于文本的文件均采用 UTF-8 或 latin-1 (Windows) 编码。我们唯一使用的 "special characters" 是德语变音符号 ä、ö、ü 和 ß。
由于各种原因(包括历史原因,也包括"properties files cannot be 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);
}
这当然很脆弱,如果文件包含其他特殊字符,将无法正常工作。