0%

文件字符编码不能推定只能否定

一、文件字符编码不能推定

文件字符编码不能推定,原因:以一个极端情形为例进行说明,文件只包含一个A字符,分别以“ASCII”和“GBK”字符编码方案进行编码,得到的字节流皆为单字节0x41,因此,文件字符编码不能被推定。

二、文件字符编码只能否定

可通过以下方式确定字符编码C不是文件的字符编码:以字符编码C对文件字节流B1进行解码得到临时字符串S,再以字符编码C对S进行编码得到字节流B2,如果B1和B2不一致,那么字符编码C不是文件的字符编码。
示意代码如下:

1
2
3
4
5
6
7
8
9
public static boolean isFileNotEncodedWith(File file, Charset charset) throws IOException {
byte[] direct = IOUtils.toByteArray(new FileInputStream(file));

String ss = new String(direct, charset);

byte[] indirect = ss.getBytes(charset);

return !Arrays.equals(direct, indirect);
}

2.1、漏判

漏判:“不是”被错认为“是”。
根据“一、文件字符编码不能推定”可知,漏判是正常现象。

2.2、误判

误判:“是”被误认为“不是”。
一般情形下,误判不可能出现,除非一些很特殊的情形:

  • 文件写程序未常规实现
  • 即便对于同一个字符编码,文件写程序和Java判断程序采用的字符码表不尽相同
您的支持将鼓励我继续分享!