Java 汉字的UTF编码

Java 汉字的UTF编码,java,encoding,utf,Java,Encoding,Utf,我通过axis Web服务的对象接收字符串。因为我没有得到我期望的字符串,我通过将字符串转换为字节进行了检查,得到了六进制的C3A4C2 BDC2A0 C3A5C2 A5C2BD C3A5C2 90C297,而我期望的是E4BDA0 E5A5BD E59097,实际上是你好吗 在UTF-8中 你知道是什么原因吗你好吗 要成为C3A4C2 BDC2A0 C3A5C2 A5C2BD C3A5C2 90C297?我在谷歌上搜索了一下,但我得到的只是一个中文网站,上面描述了python中出现的一个问题。

我通过axis Web服务的对象接收字符串。因为我没有得到我期望的字符串,我通过将字符串转换为字节进行了检查,得到了六进制的C3A4C2 BDC2A0 C3A5C2 A5C2BD C3A5C2 90C297,而我期望的是E4BDA0 E5A5BD E59097,实际上是你好吗 在UTF-8中


你知道是什么原因吗你好吗 要成为C3A4C2 BDC2A0 C3A5C2 A5C2BD C3A5C2 90C297?我在谷歌上搜索了一下,但我得到的只是一个中文网站,上面描述了python中出现的一个问题。任何见解都将是伟大的,谢谢

您有所谓的双重编码

你有三个字符的序列“你好吗" 您正确地指出,它在UTF-8中编码为E4BDA0 E5A5BD E59097

但是现在,开始用UTF-8编码该编码的每个字节。从E4开始。UTF-8中的代码点是什么?试试看!它是C3 A4

你明白了……:-)

下面是一个Java应用程序,说明了这一点:

public class DoubleEncoding {
    public static void main(String[] args) throws Exception {
        byte[] encoding1 = "你好吗".getBytes("UTF-8");
        String string1 = new String(encoding1, "ISO8859-1");
        for (byte b : encoding1) {
            System.out.printf("%2x ", b);
        }
        System.out.println();
        byte[] encoding2 = string1.getBytes("UTF-8");
        for (byte b : encoding2) {
            System.out.printf("%2x ", b);
        }
        System.out.println();
    }
}

嗨,雷,你有没有产生这个问题的示例编码?我尝试了字符串中文=新字符串(“你好吗.getBytes(“UTF-8”);String chineseAgain=new String(chinese.getBytes(“UTF-8”);System.out.println(byteArrayToHexString(chineseAgain.getBytes(“UTF-8”));但我不能复制这个问题。我可以很快给你写一个。但仅供参考,我认为我不够清楚。E4是第一个UTF编码中的第一个字节,在第二个编码中被解释为一个代码点,而不是一个hexstirng。这有帮助吗?@Maurice我在我的答案中为你添加了一个具体的例子。希望它有帮助!谢谢雷!你是的作为一名救生员,我想投票支持这一点,但由于某些原因我无法注册。最后一个问题。如果我收到C3A4C2 BDC2A0 C3A5C2 A5C2BD C3A5C2 90C297作为字符串,如何正确地将其格式化回UTF-8以便我可以保存你好吗 以UTF-8的形式进入我的数据库?只需颠倒上述步骤:首先解析
C3A4C2 BDC2A0 C3A5C2 A5C2BD C3A5C2 90C297
到字节数组
[\xc3\xa4\xc2,…]
然后执行
新字符串(byteArray,“UTF-8”)
然后使用ISO8859-1进行编码,然后使用UTF-8进行编码。
public class Encoder{
    public static void main(String[] args) throws Exception {
     String requestString="你好";
     String ISO = new String(requestString.getBytes("gb2312"), "ISO8859-1");
     String plaintxt = new String(ISO.getBytes("ISO8859-1"), "gb2312");
     plaintxt.getBytes("UTF-8");
    }
}