如何在不破坏基于 ASCII 的代码的情况下增加美国 ASCII 字符集的范围?

How to increase the scope of US ASCII charset without breaking the ASCII - based code?

我正在用

打开一个文件
private String getStringFromFile(File file) {
    try {
        return Files.readString(Paths.get(file.getPath()), StandardCharsets.US_ASCII);
    }
    catch (Exception e) {
        System.out.println("Error while reading: " + file.getName());
        return "";
    }
}

即使该文件似乎显然与 ASCII 兼容,但我得到 Error while reading: fileName

文件如下所示:

如果我在打开之前手动删除 header(带方括号的部分),代码就可以工作(我稍后会在代码中删除它们)。有没有一种方法可以扩展字符集的范围,同时又不破坏我拥有的仅适用于 ASCII 的代码,或者这是某种罕见的例外?

Here's pgn中的文件(可以txt打开)

该文件几乎是 ASCII 格式的。问题出在 `'Cote d’Ivoire'.

中的 quote 字符

该文件包含一个 0x92 字节。在 Windows 代码页 1252(西欧语言)中,它是 Unicode 字符 U+2019 右单引号。

问题是 1252 代码页与 ISO-8859-1 略有不同,ISO-8859-1 对一些常见字符(如欧元符号 和左右引号)使用未映射的位置。而且它不在始终存在字符集的列表中。

如何修复:

  • 如果您的系统支持 win1252cp1252 字符集,请使用它。
  • 否则,您应该使用 FilterInputStream 替换非 ascii 字符,例如用 space (ASCII 0x20) 或自定义映射(0x92 -> 0x27 替换 RIGHT带有简单撇号 (') 的单引号 ()。之后,InputStreamReader 会给你预期的字符。