2014-02-18 42 views
4

我发现了在Java中将字节转换为UTF8字符串的奇怪问题。 为什么字节1和字节2是不同的,但是str1和srt2是相同的?如何从java中的不同字节数据获取相同的字符串?

这里是测试代码。

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

两个字节序列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的兼容性编码方案)中定义。

相关问题