Java unicode字节解析

Ton*_*ony 4 java string unicode encoding

我只是在从文件中读取一些数据作为字节流,我刚刚遇到一些unicode字符串,我不知道如何最好地处理.

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

0x74 0x00(t) 0x72 0x00(r) ...and so on
Run Code Online (Sandbox Code Playgroud)

通常我只使用正则表达式来替换零,因此删除空格.但是,文件中的单词之间的空格是使用实现的0x00 0x00,所以尝试做一个简单的字符串'replaceAll'有点搞乱它.

我尝试过使用字符串编码集,例如'ISO-8859-1'和'UTF-8/16',但每次我都会使用空格.

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

new String(bytes).replaceAll("[\\00]{2,},"");
Run Code Online (Sandbox Code Playgroud)

但这显然只适用于双零,我真的很想用零替换单个零,并用实际的ASCII/Unicode空格字符双倍零.

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

谢谢

Esa*_*ija 7

那是"UTF-16LE".0x00 0x00实际上编码UTF-16中的NUL字符,这就是你将获得的.

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


Ian*_*rts 5

我正处于从文件中读取某些数据作为字节流的过程中,并且刚刚遇到了一些不确定如何处理的unicode字符串。

使用适当的字符集将它们转换为字符串,在这种情况下为UTF-16LE(小尾数UTF-16,低位在前,高位在后)

String str = new String(bytes, "UTF-16LE");
Run Code Online (Sandbox Code Playgroud)

  • @Tony通常不会识别编码,但会明确告诉它们。就像从http服务器上获取文件一样,该服务器可能向您发送了包含编码的http标头。没有此信息,自动检测编码将不可靠。可以手动进行最佳猜测,看看文本是否正确显示。http://en.wikipedia.org/wiki/Charset_detection (2认同)
  • @Tony实际上不是“最佳方法”,除非数据以字节顺序标记开头-如果前两个字节是FE FF,则为大端UTF-16,FF FE则为小端UTF-16, EF BB BF是UTF-8。但是,如果您正在读取二进制格式,则格式规范应告诉您期望使用哪种编码(包括字节序)。 (2认同)