我在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));
}
}
Run Code Online (Sandbox Code Playgroud)
这是在jdk7上运行的测试代码的输出
bytes1 length: 6
bytes2 length: 4
str1 is equals str2? true
Run Code Online (Sandbox Code Playgroud)
是否可以找出“EDA0BDEDB88A”和“F09F988A”之间的关系?
“F09F988A”是unicode smailface,但“EDA0BDEDB88A”未知。
字节序列 F09F988A 和 EDA0BDEDB88A 均由 Java 解码为相同的代码点 U+1F60A(微笑的脸和微笑的眼睛)。
即使编码 EDA0BDEDB88A 不正确,Java UTF-8 实现也会接受它作为每个代理代码点 U+D83D 和 U+DE0A 的单独 UTF-8 编码。然而,严格来说,这种表示形式在 UTF-8 中是不允许的,但例如在 CESU-8(UTF-16 的兼容性编码方案)中定义。
归档时间: |
|
查看次数: |
256 次 |
最近记录: |