我们所有基于文本的文件都是用UTF-8或拉丁文-1 (Windows)编码的.我们使用的唯一的“特殊字符”是德文“umlauts”、“ü”和“only”。
由于不同的原因(包括历史原因,但也有“属性文件不能是UTF-8”的旧问题),我们无法完全统一编码。
当人们用Java读取文本文件并使用错误的编码时,这显然会导致错误。
是否有一种简单可靠的方法来检测一个文件是UTF-8还是拉丁文-1,如果您知道唯一可能的特殊字符是上面所示的字符。
还是需要将文件读取为字节数组并搜索特殊字节?
发布于 2017-08-11 14:19:06
如果唯一的非ASCII字符是“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);
}
当然,这是相当脆弱的,如果文件包含其他特殊字符,它将无法工作。
https://stackoverflow.com/questions/45637016
复制相似问题