Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java unicode字节解析_Java_String_Unicode_Encoding - Fatal编程技术网

Java unicode字节解析

Java unicode字节解析,java,string,unicode,encoding,Java,String,Unicode,Encoding,我正在以字节流的形式从文件中读取一些数据,我刚刚遇到了一些unicode字符串,我不确定如何最好地处理它们 每个字符使用两个字节,只有第一个字节似乎包含实际数据,因此,例如字符串“trust”存储在文件中,如下所示: 0x74 0x00(t) 0x72 0x00(r) ...and so on 通常我只使用正则表达式将零替换为零,从而删除空白。但是,文件中单词之间的空格是使用0x00 0x00实现的,因此尝试使用一个简单的字符串“replaceAll”会有点混乱 我尝试过使用字符串编码集,比如

我正在以字节流的形式从文件中读取一些数据,我刚刚遇到了一些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

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

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


啊,是的,就是这样,我找不到。这回答了我的问题并解决了它。非常感谢您的快速回复,我会尽快点击“接受”。谢谢伊莎莉亚!谢谢伊恩,这正是我所做的。出于兴趣,识别正在使用的unicode字符集类型的最佳方法是什么?@Tony通常不会识别编码,而是明确告知。就像从http服务器获取文件一样,服务器可能会向您发送一个包含编码的http头。如果没有这些信息,自动检测编码是不可靠的。人们可以手动进行最佳猜测,看看文本是否正确@Tony除非数据以字节顺序标记开始,否则没有“最佳方式”——如果前两个字节是FE FF,那么它是大端UTF-16,FF FE,那么它是小端UTF-16,EF BB BF,它是UTF-8。但是,如果您正在阅读二进制格式,那么格式规范应该告诉您预期的编码(包括endianness)。非常感谢输入人员,非常感谢!
String str = new String(bytes, "UTF-16LE");