UI中的双字节编码问题

时间:2016-02-04 07:58:42

标签: java encoding utf

我在应用程序UI中看到了一种奇怪的行为

同一组字符在一个地方的UI中正确显示,同一组在另一个地方错误显示

江苏南通二建集团有限公司----------------->正确显示

江苏南通二���集团有限公司--------------------->显示错误

我们每个地方都使用utf-8

1 个答案:

答案 0 :(得分:1)

找一些可以从调查开始的地方。就您而言,涉及不同的应用程序/环境时,从外部提供解决方案非常困难。

对我而言,它看起来不像是一般编码问题,因为只有一个字符会出现乱码。编码问题时的正常行为是,破坏的字符被REPLACEMENT CHARACTER replaced替换。在你的情况下,有三个。因此,我相信在处理过程中有一些代码可以分析字符/字节并进行错误的替换。

您期望的字符串二建集 - \u4E8C\u5EFA\u96C6将返回二���集 - \u4E8C\uFFFD\uFFFD\uFFFD\u96C6。如果建 - \u5EFA的编码被破坏,则应仅将替换字符替换为二�集 - \u4E8C\uFFFD\u96C6

是否涉及任何假定8位字符并可能尝试用另一个字符替换^ - 0x5E的代码?

可以使用以下代码段发现可能导致替换字符的所有可能替换。

byte[] b = {(byte) 0x5E, (byte) 0xFA}; // the bytes for 建
for (int i = 0; i < 256; i++) {
    b[0] = (byte) i;
    char c = new String(b, StandardCharsets.UTF_16BE).charAt(0);
    if (c == 0xFFFD) { // check if the encoding lead to the replacement character
        System.out.print((char) i);
        System.out.print(' ');
    }
}

输出

Ø Ù Ú Û Ü Ý Þ ß

这可以解释为什么角色会出现乱码。但是不会回答其他两个替换字符where所在的问题。

但也许这已经有助于更接近问题的根源。