我从一个文件中读取一个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()
中 CharacterCodingException
的 catch
block 说:
} catch (CharacterCodingException x) {
// Substitution is always enabled,
// so this shouldn't happen
关于java - 将字符串转换为 byte[] 返回错误值(编码?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29238064/