我在Java中将字节转换为UTF8字符串时发现了一个奇怪的问题。 为什么bytes1和bytes2不同,但str1和srt2是一样的?
这是测试代码。
import org.apache.commons.codec.binary.Hex;
public class MyTest {
public static void main(String[] args) throws Exception {
byte[] bytes1 = Hex.decodeHex("EDA0BDEDB88A".toCharArray());
byte[] bytes2 = Hex.decodeHex("F09F988A".toCharArray());
System.out.println("bytes1 length: " + bytes1.length);
System.out.println("bytes2 length: " + bytes2.length);
String str1 = new String(bytes1, "utf8");
String str2 = new String(bytes2, "utf8");
System.out.println("str1 is equals str2? " + str1.equals(str2));
}
}
以下是在jdk7上运行的测试代码的输出
bytes1 length: 6
bytes2 length: 4
str1 is equals str2? true
是否有可能找出'EDA0BDEDB88A'和'F09F988A'之间的关系?
'F09F988A'是unicode smail face,但'EDA0BDEDB88A'未知。
答案 0 :(得分:0)
字节序列F09F988A和EDA0BDEDB88A都被Java解码为相同的代码点U + 1F60A(SMILING FACE WITH SMILING EYES)。
即使编码EDA0BDEDB88A不正确,Java UTF-8实现也接受它作为每个代理代码点U + D83D和U + DE0A的单独UTF-8编码。然而,严格地说,这种表示在UTF-8中是不允许的,但是例如在CESU-8中定义(UTF-16的兼容性编码方案)。