2

我正在尝试使用 Java 中的 GB18030 cp 对一些汉字进行编码,我遇到了这个字符数,它在谷歌翻译中翻译为“数字”。

问题是,它在编码时变成了 10 个字节(!):

81 30 81 34 81 30 83 31

import java.math.BigInteger;
import java.nio.charset.Charset;
public class Test3
{
    public static void main(String[] args)
    {        
        String s = new String("数");
        System.out.println( "source file: "+String.format("%x ", 
                new BigInteger(1, s.getBytes(Charset.forName("GB18030"))) ));       
    }    
}

当我尝试使用 GB18030 对其进行解码时,它会导致?出现在中文数字字符(??数)旁边的字符。当我尝试仅解码上面的最后两个字节“CA FD”时,它会正确解码为字符。

谷歌翻译注意到上面的字符是简体的。我的源文件也以 UTF8 格式保存。

我以为 GB18030 每个字符最多 4 个字节?这个角色表现得如此奇怪有什么特别的原因吗?(我不是中国人,顺便说一句)

4

1 回答 1

4

最可能的情况是:

  1. 源文件的编码存在问题,或者

  2. 在其中的数字之前,您有“不可见”的字符。

您可以通过完全删除此行上的字符串文字来检查这两个:

String s = new String("数");

所以它看起来像这样(注意我删除了引号和字符):

String s = new String();

然后添加回来"\u6570"得到这个:

String s = new String("\u6570");

并查看您的输出是否发生变化(因为 数 是 Unicode 代码点U+6570,因此转义序列应该是相同的字符)。如果它发生变化,则可能是编码问题,或者您在字符之前的字符串中有不可见的字符。您可以通过仅添加该字符(通过从该页面复制和粘贴而不是您以前的源代码)来区分这两种情况。如果问题再次出现,则为编码问题。如果没有,你有隐藏的字符。

于 2013-07-08T07:52:28.090 回答