java - 汉字编码成太多字节

标签 java localization

我试图在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 个字节?这个角色的行为如此奇怪有什么特殊原因吗? (顺便说一句,我不是中国人)

最佳答案

最有可能的情况是:

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

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

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

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/

相关文章:

java - 处理线程池并等待notifyALL()

java - 调整大小过程中 OpenImaj OutOfMemoryError

java - admob + surfaceview 玩的不好

java - Spring 安全 : Error during artifact deployment caused by <filter> and <filter-mapping> sections in web. xml

unit-testing - 带有 IStringLocalizer 的 asp.net 核心测试 Controller

iOS:确定设备语言是否为从右到左 (RTL)

iphone - NSLocalizedString : Why is genstrings adding 1$ and 2$ to my format specifiers?

java - multidex 应用程序在尝试运行仪器测试时出现 ZipException : duplicate entry for junit,

c++ - WinAPI 将 FILETIME 格式化为带有日期和/或时间的本地化字符串

swift - 格式化具有多个值的本地化字符串