我做了简单的测试,似乎 String 到 bytes[] 的 Java 转换不是一对一的,至少使用 UTF-8 是这样。
代码:
byte[] bytes1 = {-1, 127, 0, 38, 97, 104, 55, 110, 50, -24, -48, 59, -20, -6, 64, 1, 4, 107, 56, 54 };
String msg = new String( bytes1, "UTF-8" );
byte[] bytes2 = msg.getBytes( "UTF-8" );
for( byte curr : bytes1 ) {
System.out.print( curr );
System.out.print( ", " );
}
System.out.println();
for( byte curr : bytes2 ) {
System.out.print( curr );
System.out.print( ", " );
}
我想我会看到两行相等的输出。实际上是:
-1, 127, 0, 38, 97, 104, 55, 110, 50, -24, -48, 59, -20, -6, 64, 1, 4, 107, 56, 54,
-17, -65, -67, 127, 0, 38, 97, 104, 55, 110, 50, -17, -65, -67, -17, -65, -67, 59, -17, -65, -67, -17, -65, -67, 64, 1, 4, 107, 56, 54,
我想知道为什么会发生这种情况以及如何实现一对一转换。有人知道吗?
最佳答案
你不能为任意文本。从 UTF-16(字符串表示)到 UTF-8 的转换被定义为非一对一的。请参阅 Unicode.org 上的 Unicode 标准。
看起来您真正想要的是将“UTF-16”作为字符集传递,因此要求对 UTF-16 进行字节序列化而不是转换为 UTF-8。
参见 http://docs.oracle.com/javase/6/docs/technotes/guides/intl/encoding.doc.html .如果您不需要 BOM,请使用“未标记”变体。
关于Java从String到bytes的转换不是一对一的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9298381/