Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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中处理windows-1252和unicode_Java_Unicode_Utf 8_Character Encoding_Bytearray - Fatal编程技术网

在java中处理windows-1252和unicode

在java中处理windows-1252和unicode,java,unicode,utf-8,character-encoding,bytearray,Java,Unicode,Utf 8,Character Encoding,Bytearray,在http请求之后,我得到了一个用utf-8编码的字节数组,例如: 我使用 新字符串(数组,“UTF-8”) 在本例中,第一个解码字符是0xe4,它表示Unicode中的字母ä——到目前为止没有问题。第二个字符0x96代表Windows-1252中的en破折号–,而在Unicode中它代表一些称为spa保护区开始的控制字符 当Java将字符解释为Unicode时,我得到了一些不可见的字符 我的问题:如何正确解码字节数组以获得ä–(0xe4 0x2013) 提前感谢您的帮助:)您的服务器似乎将I

在http请求之后,我得到了一个用utf-8编码的字节数组,例如:

我使用
新字符串(数组,“UTF-8”)

在本例中,第一个解码字符是
0xe4
,它表示Unicode中的字母
ä
——到目前为止没有问题。第二个字符
0x96
代表Windows-1252中的en破折号
,而在Unicode中它代表一些称为
spa保护区开始的控制字符

当Java将字符解释为Unicode时,我得到了一些不可见的字符

我的问题:如何正确解码字节数组以获得
ä–
0xe4 0x2013


提前感谢您的帮助:)

您的服务器似乎将ISO-Latin-1编码与专有的Windows-1252代码页混淆,编码数据就是由此产生的。Windows-1252代码页与ISO-Latin-1仅在几个地方有所不同

您可以通过使用错误假设的拉丁语-1将数据转换回服务器看到的字节来修复数据,然后将其解释为CP1252,如下所示:

String string = new String(array, "UTF-8");
byte[] fix = string.getBytes(StandardCharsets.ISO_8859_1);
string = new String(fix, "Windows-1252");

没有“Unicode字符串”或“Latin-1”字符串;字符串只是一个字符序列。您明确指定了UTF-8。你期待什么?“不知道是谁做的这些胡说八道”照镜子,你会看到他/她。看看你的代码。你认为
“UTF-8”
暗指
“Latin-1”
,还是编译器/运行时可以神奇地告诉你,你想要的不是你告诉它的东西?“而事实上它是一个Latin-1字符串”-你刚才说它是用UTF-8编码的。不清楚你在说什么…你可以编辑它来添加信息或澄清问题。非常感谢。这正是问题的原因。多亏了您的解决方案,我现在可以对其进行补偿。如果字节编码为UTF-8,那么它们就不会编码为ISO8859-1或Windows-1252。反之亦然。使用错误的字符集对原始字节进行解码会产生错误的字符,然后对(现在已损坏的)字符进行重新编码,以便再次对其进行解码(进一步损坏)是没有用的。只需首先使用正确的字符集对原始字节进行解码。您应该遵循HTTP规范,并查看响应的
内容类型
标题,以了解响应实际使用的是哪个字符集。如果未定义字符集,请使用HTTP协议或特定媒体类型定义的适当默认值。UTF-8中的
0xc3 0xa4 0xe2 0x80 0x93
,因此
0xc3 0xa4 0xc2 0x96
显然不是UTF-8,不应将其解码为UTF-8。
ä–
最终可能成为
0xc3 0xa4 0xc2 0x96
的唯一方法是,如果服务器对数据进行了错误编码。您需要修复服务器以正确编码数据,而不是让客户端对其进行修复。如果你输入的是损坏的数据,那么你将输出损坏的数据。@Remy Lebeau:我已经写过,是服务器出错了。它显然读取cp1252编码的文件,但在将其转换为UTF8时将其视为拉丁1编码。当然,修复服务器应该是首选选项,但我们不知道该选项是否可用。
String string = new String(array, "UTF-8");
byte[] fix = string.getBytes(StandardCharsets.ISO_8859_1);
string = new String(fix, "Windows-1252");