Java。文件编码是否会影响纯字节级别的文件比较?

问题描述 投票:0回答:1

我使用以下内容来比较两个假定相同的文件的内容。我读过——至少对于文本文件,如 TXT 或 HTML——文件的编码会影响文件的十六进制序列如何转换为字符:即,对于相同的十六进制序列,文件以 UTF 编码-8 将显示与 ASCII 编码不同的内容。文件编码会影响我下面的代码吗?或者不是,因为我正在比较基本字节级别的文件内容,不关心十六进制序列?

bin_1 = new BufferedInputStream(file_input_stream_1); 
bin_2 = new BufferedInputStream(file_input_stream_2);

byte[] barr_1 = new byte[8192];
byte[] barr_2 = new byte[8192]; 

while(bin_1.available() > 0){

    bin_1.read(barr_1); bin_2.read(barr_2);

    if(Arrays.equals(barr_1, barr_2) == false){
        break;
    }

    else{

        barr_1 = new byte[8192]; 
        barr_2 = new byte[8192];
        continue;

    }
    
}
java utf-8 character-encoding byte ascii
1个回答
0
投票

...字节的基本级别,不涉及十六进制序列

我认为你在这里有一个误解。字节是 8 位的组,以十六进制表示以节省一些空间(例如 FF 相当于字节值 11111111)。所以这些本质上是相同的。

话虽这么说,是的编码会影响比较,因为字符可能表示为不同的字节。只要您的文本仅包含 ASCII 字符,通用编码就有可能产生相同的字节,因为 UTF-8 和 Latin-1 共享相同的基本序列。 但是,其他编码可能完全不同。 作为示例,使用文本“stackoverflow”。

拉丁语-1:
    73 74 61 63 6B 6F 76 65 72 66 6C 6F 77
  • UTF-8:
  • 73 74 61 63 6B 6F 76 65 72 66 6C 6F 77
  • UTF-16 大端:
  • 0073 0074 0061 0063 006B 006F 0076 0065 0072 0066 006C 006F 0077
  • 
    
  • 另请注意,UTF-8 文件有带或不带
BOM(字节顺序标记)

,因此您需要相应地调整比较。这意味着以下十六进制序列基本上代表相同的内容:

无BOM:
    73 74 61 63 6B 6F 76 65 72 66 6C 6F 77
  • 含物料清单:
  • EF BB BF 73 74 61 63 6B 6F 76 65 72 66 6C 6F 77
  • 
    
您现在可能会问:那么我如何比较这些文件?

嗯,你最好在字符级别上比较它们,因为 Java 在内部使用一种字符代码。但是,您需要知道文件的编码,以告诉 Java 在加载文件时如何将字节转换为字符 - 并且您可能仍然需要查找 UTF-8 BOM,因为 Java 很可能会尝试读取它作为角色。

© www.soinside.com 2019 - 2024. All rights reserved.