当一个web服务返回一个包含希腊字符的json时,这个问题就出现了。实际上它是Mykonos城。问题是无论我使用什么编码或转换,它总是显示为:Μ keoxCE?o Σ。但它应该显示:收到
使用Powershell,我能够验证Web服务是否返回正确的字符。
我缩小了在Groovy中将字节数组转换为String时的问题范围。下面的代码重现了我遇到的问题。myUTF8String保存了我从URLConnection.content.text中获得的字节数组。要查看的UTF8字节序列是0xce,0x9d。将其转换为字符串并转换回字节数组后,该字符的字节序列是0xce。0x3f。下面的代码将显示原始字节数组和转换后的字符串在第9位的差异。下面的测试我使用的是Groovy Console 4.0.6。
有什么线索吗?
import java.nio.charset.StandardCharsets;
def myUTF8String = "ce9cce8ece9ace9fce9dce9fcea3"
def bytes = myUTF8String.decodeHex();
content = new String(bytes).getBytes()
for ( i = 0; i < content.length; i++ ) {
if ( bytes[i] != content[i] ) {
println "Different... at pos " + i
hex = Long.toUnsignedString( bytes[i], 16).toUpperCase()
print hex.substring(hex.length()-2,hex.length()) + " != "
hex = Long.toUnsignedString( content[i], 16).toUpperCase()
println hex.substring(hex.length()-2,hex.length())
}
}
多谢了
安德烈亚斯
1条答案
按热度按时间egmofgnx1#
当从字节构建字符串时,您必须指定字符集名称,否则将使用默认java字符集-并且不需要urf-8。
返回此Java虚拟机的默认字符集。
与String.getBytes()相同的问题-使用charset参数获取正确的字节序列。
只需更改代码中的以下行,问题就会消失:
作为一个选项,您可以使用以下命令行参数为整个JVM示例设置默认字符集:
但是要小心,因为它将影响整个JVM示例!
https://docs.oracle.com/en/java/javase/19/intl/supported-encodings.html#GUID-DC83E43D-52F6-41D9-8F16-318F3F39D54F