我试图在Java中使用GB18030 cp对一些中文字符进行编码,并且遇到了这个字符数,它在谷歌翻译中翻译为“数字”。
问题是,编码后它变成了 10 个字节(!):
81 30 81 34 81 30 83 31 ca FD
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 个字节?这个角色的行为如此奇怪有什么特殊原因吗? (顺便说一句,我不是中国人)
最佳答案
最有可能的情况是:
源文件的编码存在问题,或者
其中的数字之前有“不可见”字符。
您可以通过完全删除此行上的字符串文字来检查这两个内容:
String s = new String("数");
所以它看起来像这样(注意我删除了引号和字符):
String s = new String();
然后添加回“\u6570”
以获得:
String s = new String("\u6570");
并查看输出是否发生变化(因为数是 Unicode 代码点 U+6570,因此转义序列应该是相同的字符)。如果它发生变化,要么存在编码问题,要么字符串中该字符之前有不可见的字符。您可以通过仅添加回该字符(通过从该页面复制并粘贴而不是以前的源代码)来区分这两种情况。如果问题再次出现,则是编码问题。如果没有,则说明您有隐藏角色。
关于java - 汉字编码成太多字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17521123/