我正在从文件中以字节流的形式读取一些数据,我刚刚遇到了一些我不确定如何最好地处理的 unicode 字符串。
每个字符使用两个字节,只有第一个字节似乎包含实际数据,因此例如字符串“trust”在文件中存储为:
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 实际上提供了这样做的机制?
谢谢
最佳答案
那是 “UTF-16LE”
。 0x00 0x00
实际上以 UTF-16 编码 NUL 字符,所以这就是您将得到的。
这种编码可以对大约一百万个不同的字符进行编码,每个字符使用 2 或 4 个字节。前 256 个字符用第二个字节 0x00
编码,如果文本仅包含这些字符,则它可能被视为无用,但其余字符则需要它。例如,欧元货币符号 €
将显示为 0xAC 0x20
。
关于Java unicode字节解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14749966/