读取“德语”文本文件的编码无关方法

4

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

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

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

如果您知道可能的特殊字符仅限于上述字符,是否有一种简单可靠的方法来检测文件是UTF-8还是latin-1?

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


因为你想检查一些特殊字符,也许这个可以帮到你:myText.matches(".*[äöüß].*") - Youcef LAIDANI
UTF-8 编码的文件是否有字节序标记?否则就无法确定(例如,在简短的德语文本中可能会出现变音符号,但这并不能作为安全指示的依据)。反过来,一个 UTF-8 文件中可能没有超出经典 ASCII 字符集以外的字符,所以如果没有字节序标记,你怎么判断? - Cee McSharpface
很遗憾,标准文本文件中没有元信息。这意味着该文件不包含其内容或编码的任何指示。唯一可能给你提示的是Unicode字节顺序标记,但这些很少使用。因此,您必须通过检查字节来“猜测”编码。 - f1sh
通过这个回答这个看起来很有前途 - Cee McSharpface
你可以搜索第一个不在ASCII范围内的字节,然后检查它是否是Latin-1中的Umlaut或ß,或者是这样一个Umlaut的UTF-8编码的开始。这将确定编码方式。 - Henry
1个回答

2

如果只有 "ä、ö、ü 和 ß" 这些非 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);
}

当然,这种方法非常脆弱,如果文件包含其他特殊字符,则无法正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接