java - 编码不可知的方式来读取 "German"文本文件

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

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

由于各种原因(包括历史原因,还有“属性文件不能是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);
}

这当然是非常脆弱的,如果文件包含其他特殊字符,将无法工作。

关于java - 编码不可知的方式来读取 "German"文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45637016/

相关文章:

java - 加法游戏栅栏柱问题,加法符号显示在等式之前

Java运行jar文件并包含外部jar

css 显示不正确

c# - 使用 StringWriter 进行 XML 序列化

json - "Bytes to be written to the stream exceed the Content-Length bytes size specified"与 UTF8 编码的 json

python - 在 python 脚本中使用 utf-8 文件名时出错

java - 为什么线程不在本地缓存对象?

java - 将 BigInteger 转换为二进制字符串

mysql - 将旧服务器的 "wrong"MySQL 编码转换为新服务器上的正确 UTF-8

maven - 过滤不同编码的资源