在java中处理windows-1252和unicode
在http请求之后,我得到了一个用utf-8编码的字节数组,例如: 我使用在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
新字符串(数组,“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");