如何在不破坏基于 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 对一些常见字符(如欧元符号 €
和左右引号)使用未映射的位置。而且它不在始终存在字符集的列表中。
如何修复:
- 如果您的系统支持
win1252
或 cp1252
字符集,请使用它。
- 否则,您应该使用
FilterInputStream
替换非 ascii 字符,例如用 space (ASCII 0x20) 或自定义映射(0x92 -> 0x27 替换 RIGHT带有简单撇号 ('
) 的单引号 (’
)。之后,InputStreamReader
会给你预期的字符。
我正在用
打开一个文件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 对一些常见字符(如欧元符号 €
和左右引号)使用未映射的位置。而且它不在始终存在字符集的列表中。
如何修复:
- 如果您的系统支持
win1252
或cp1252
字符集,请使用它。 - 否则,您应该使用
FilterInputStream
替换非 ascii 字符,例如用 space (ASCII 0x20) 或自定义映射(0x92 -> 0x27 替换 RIGHT带有简单撇号 ('
) 的单引号 (’
)。之后,InputStreamReader
会给你预期的字符。