首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在java中,如何从不同的字节数据中获取相同的字符串呢?

在java中,如何从不同的字节数据中获取相同的字符串呢?
EN

Stack Overflow用户
提问于 2014-02-18 18:14:14
回答 1查看 224关注 0票数 4

我在Java中将字节转换为UTF8字符串时发现了一个奇怪的问题。为什么bytes1和bytes2是不同的,而str1和srt2是相同的?

以下是测试代码。

代码语言:javascript
运行
复制
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上运行的测试代码的输出

代码语言:javascript
运行
复制
bytes1 length: 6
bytes2 length: 4
str1 is equals str2? true

能否找出'EDA0BDEDB88A‘和'F09F988A’之间的关系?

“F09F988A”是unicode smail face,但“EDA0BDEDB88A”未知。

EN

回答 1

Stack Overflow用户

发布于 2014-02-18 20:03:27

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21850506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档