Java的Unicode字节解析(Java unicode byte parsing)

2019-07-19 13:39发布

我只是从一个文件的字节流中读取一些数据的过程中,我只是遇到了一些的Unicode字符串,我不知道如何以最佳方式处理。

每个字符使用两个字节,仅在第一个表面上的,以包含实际数据,因此,例如字符串“信任”被存储在文件中:

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

一般情况下我只是使用正则表达式来替换没有零点,因此删除空白。 但是,该文件中的单词之间的空格实现使0x00 0x00 ,所以试图做一个简单的字符串“的replaceAll”是种它搞乱了一点。

我已经试过用字符串编码集玩耍,如“ISO-8859-1”和“UTF-8/16”,但每次我结束了空白。

我没有创建一个简单的正则表达式来去除双零个十六进制值,这就是:

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

但是,这显然只适用于双零,我很想有一个实际的ASCII / Unicode空格字符来代替单一的零一无所有,和双零。

我可以发誓的处理这种事情的Java字符串格式设置一个,但我可能是错的。 所以我应该创造一个正则表达式来剥离出零工作,或不实际的Java做这件事的提供机制?

谢谢

Answer 1:

这是"UTF-16LE" 0x00 0x00实际上编码在UTF-16中的NULL字符所以这就是你会得到什么。

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



Answer 2:

我只是从一个文件的字节流中读取一些数据的过程中,我只是遇到了一些的Unicode字符串,我不知道如何以最佳方式处理。

将它们转换为使用适当的字符集的字符串,在这种情况下UTF-16LE(little-endian的UTF-16,与低位字节第一其次高位字节)

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


文章来源: Java unicode byte parsing