【问题标题】:Java unicode byte parsingJava unicode 字节解析
【发布时间】:2013-01-22 21:13:54
【问题描述】:

我只是在以字节流的形式从文件中读取一些数据,我刚刚遇到了一些我不确定如何最好地处理的 unicode 字符串。

每个字符使用两个字节,只有第一个似乎包含实际数据,因此例如字符串“trust”在文件中存储为:

0x74 0x00(t) 0x72 0x00(r) ...and so on

通常我只会使用正则表达式将零替换为空,从而删除空格。但是,文件中单词之间的空格是使用0x00 0x00 实现的,所以尝试做一个简单的 String 'replaceAll' 有点搞砸了。

我尝试过使用字符串编码集,例如“ISO-8859-1”和“UTF-8/16”,但每次我都以空白结尾。

我确实创建了一个简单的正则表达式来删除双零十六进制值,即:

new String(bytes).replaceAll("[\\00]{2,},"");

但这显然只适用于双零,我真的很想用任何东西替换单零,用实际的 ASCII/Unicode 空格字符替换双零。

我可以发誓其中一个 Java 字符串格式设置可以处理这种事情,但我可能错了。那么我应该努力创建一个正则表达式来去除零,还是 Java 实际上提供了这样做的机制?

谢谢

【问题讨论】:

    标签: java string unicode encoding


    【解决方案1】:

    我只是在以字节流的形式从文件中读取一些数据,我刚刚遇到了一些我不确定如何最好地处理的 unicode 字符串。

    使用适当的字符集将它们转换为字符串,在本例中为 UTF-16LE(小端 UTF-16,低位字节在前,然后是高位字节)

    String str = new String(bytes, "UTF-16LE");
    

    【讨论】:

    • 谢谢伊恩,这正是我所做的。出于兴趣,识别正在使用的 unicode 字符集类型的最佳方法是什么?
    • @Tony 通常不会识别编码,而是明确告知。就像您从 http 服务器获取文件一样,服务器可能会向您发送一个包含编码的 http 标头。没有这些信息,编码的自动检测是不可靠的。手动可以做一个最好的猜测,看看文本是否正确。 en.wikipedia.org/wiki/Charset_detection
    • @Tony 没有真正的“最佳方式”,除非数据以字节顺序标记开头 - 如果前两个字节是 FE FF 那么它是大端 UTF-16,FF FE 然后它是小端 UTF-16,EF BB BF 是 UTF-8。但是,如果您正在阅读二进制格式,那么格式规范应该会告诉您预期的编码(包括字节序)。
    • 感谢大家的意见,非常感谢!
    【解决方案2】:

    那是"UTF-16LE"0x00 0x00 实际上将 NUL 字符编码为 UTF-16,这就是您将得到的。

    这种编码可以编码大约一百万个不同的字符,每个字符使用 2 或 4 个字节。前 256 个字符用第二个字节 0x00 编码,如果文本只包含那些它可能被视为无用,但它是其余字符所必需的。例如,欧元货币符号 将显示为0xAC 0x20

    【讨论】:

    • 啊,是的,就是这样,我找不到要查找的内容。这回答了我的问题并解决了它。非常感谢您的快速回复,我会尽快点击接受。谢谢 Esailija!
    猜你喜欢
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 2017-05-30
    • 2019-01-05
    • 2016-01-13
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多