我在应用程序UI中看到了一种奇怪的行为
同一组字符在一个地方的UI中正确显示,同一组在另一个地方错误显示
江苏南通二建集团有限公司----------------->正确显示
江苏南通二���集团有限公司--------------------->显示错误
我们每个地方都使用utf-8
答案 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所在的问题。
但也许这已经有助于更接近问题的根源。