8

我通过轴网络服务的对象接收字符串。因为我没有得到我期望的字符串,所以我通过将字符串转换为字节进行了检查,我得到了十六进制的 C3A4C2 BDC2A0 C3A5C2 A5C2BD C3A5C2 90C297,当我期待 E4BDA0 E5A5BD E59097 这实际上是 UTF- 8.

有什么想法可能导致你变成 C3A4C2 BDC2A0 C3A5C2 A5C2BD C3A5C2 90C297 我做了一个谷歌搜索,但我得到的只是一个描述python中发生的问题的中文网站。任何见解都会很棒,谢谢!

4

2 回答 2

17

你有所谓的双重编码。

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

但是现在,开始用 UTF-8 对 THAT 编码的每个字节进行编码。从 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();
    }
}
于 2011-07-27T01:24:41.817 回答
0
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");
    }
}
于 2021-03-22T04:39:34.890 回答