java - 将字符串转换为 byte[] 返回错误值(编码?)

标签 java

我从一个文件中读取一个byte[]并将其转换为一个String:

byte[] bytesFromFile = Files.readAllBytes(...);
String stringFromFile = new String(bytesFromFile, "UTF-8");

我想将它与我从 Web 服务获得的另一个 byte[] 进行比较:

String stringFromWebService = webService.getMyByteString(); 
byte[] bytesFromWebService = stringFromWebService.getBytes("UTF-8");

所以我从一个文件中读取了一个 byte[] 并将其转换为一个 String 然后我从我的网络服务中得到了一个 String 并且将其转换为 byte[]。然后我进行以下测试:

// works!
org.junit.Assert.assertEquals(stringFromFile, stringFromWebService);

// fails!
org.junit.Assert.assertArrayEquals(bytesFromFile, bytesFromWebService);

为什么第二个断言会失败?

最佳答案

其他答案涵盖了可能的事实,即文件不是 UTF-8 编码,从而导致所描述的症状。

但是,我认为这其中最有趣的方面不是 byte[] 断言失败,而是 assert 字符串值相同 通过。我不是 100% 确定这是为什么,但我认为以下对源代码的拖网可能会给我们答案:

  • 看看如何 new String(bytesFromFile, "UTF-8");有效 - 我们看到构造函数调用了 StringCoding.decode()
  • 反过来,如果提供了 UTF-8 字符集,则调用 StringDecoder.decode()
  • 这会调用 CharsetDecoder.decode()如果字符不可映射(我猜如果出现非 UTF-8 字符会出现这种情况)
  • 在本例中,它使用了一个 Action defined by

    private CodingErrorAction unmappableCharacterAction
        = CodingErrorAction.REPORT;
    
  • 这意味着它仍然是reports the character it has decoded ,即使它在技术上是不可映射的。

  • 我认为这意味着即使代码得到一个不可映射的字符,它也会替换它的最佳猜测 - 所以我猜测它的最佳猜测是正​​确的,因此 String 表示是对比下一样,但是byte[]已经不一样了。

StringCoding.decode()CharacterCodingExceptioncatch block 说:

>
} catch (CharacterCodingException x) {
            // Substitution is always enabled,
            // so this shouldn't happen

关于java - 将字符串转换为 byte[] 返回错误值(编码?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29238064/

相关文章:

java - JPA:使用附加属性映射多对多关系

java - AlarmManager 和接收器的多重通知 Android Studio Java

java - 通过 R.string 引用字符串

java - 无法使用 Java/webDriver 中的选择类更改选择框值

java - 保存程序的状态

java - 提交按钮还会验证并显示警报对话框

java - 在 Java 中使用 XPATH 从 XML 读取正则表达式

java - 使用 ANT 编译 groovy 脚本时不支持 Major.minor 版本 51.0

java - 如何将以下递归函数转换为 for 循环迭代

java - 使用 openssl 创建 .p12 信任库