Groovy -从UTF8字节创建的字符串包含错误字符

vq8itlhq  于 2022-11-21  发布在  其他
关注(0)|答案(1)|浏览(299)

当一个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())
       }
}

多谢了
安德烈亚斯

egmofgnx

egmofgnx1#

当从字节构建字符串时,您必须指定字符集名称,否则将使用默认java字符集-并且不需要urf-8。
返回此Java虚拟机的默认字符集。
与String.getBytes()相同的问题-使用charset参数获取正确的字节序列。
只需更改代码中的以下行,问题就会消失:

content =  new String(bytes, "UTF-8").getBytes("UTF-8")

作为一个选项,您可以使用以下命令行参数为整个JVM示例设置默认字符集:

java -Dfile.encoding=UTF-8 <your application>

但是要小心,因为它将影响整个JVM示例!
https://docs.oracle.com/en/java/javase/19/intl/supported-encodings.html#GUID-DC83E43D-52F6-41D9-8F16-318F3F39D54F

相关问题