编码不可知的方式来读取“德语”文本文件

时间:2017-08-11 13:56:51

标签: java encoding utf-8 iso-8859-1

我们所有基于文本的文件都以UTF-8或latin-1(Windows)编码。我们使用的唯一“特殊字符”是德语变形金刚ä,ö,ü和ß。

由于不同的原因(包括历史,但也有“属性文件不能是UTF-8”的旧问题),我们无法完全统一编码。

当人们用Java读取文本文件并使用错误的编码时,这显然会导致错误。

如果您知道唯一可能的特殊字符是上面指出的字符,是否有一种简单,可靠的方法来检测文件是UTF-8还是latin-1。

或者我是否需要将文件读取为字节数组并搜索特殊字节?

1 个答案:

答案 0 :(得分:1)

如果只有非ASCII字符是“ä,ö,ü和ß”,那么你可以使用它们的第一个代码是UTF_8中的195(-61作为字节)。在ISO 8859中,字符195是Ã,显然你不希望找到它。

所以解决方案可能是这样的:

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);
}

这当然非常脆弱,如果文件包含其他特殊字符,则无法使用。

相关问题