【问题标题】:how can it be possible getting the same string from different bytes data in java?java - 如何从java中的不同字节数据中获取相同的字符串?
【发布时间】:2014-03-18 00:19:48
【问题描述】:

我在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' 未知。

【问题讨论】:

    标签: java utf-8 byte


    【解决方案1】:

    两个字节序列 F09F988A 和 EDA0BDEDB88A 都被 Java 解码为相同的代码点 U+1F60A(微笑的脸和微笑的眼睛)。

    即使编码 EDA0BDEDB88A 不正确,Java UTF-8 实现也接受它作为每个代理代码点 U+D83D 和 U+DE0A 的单独 UTF-8 编码。然而,这种表示在 UTF-8 中严格来说是不允许的,但例如在 CESU-8(UTF-16 的兼容性编码方案)中定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 2017-04-17
      • 2019-05-01
      • 2020-07-25
      • 2022-01-05
      相关资源
      最近更新 更多