首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么一个汉字需要一个字符(2个字节),而需要3个字节?

为什么一个汉字需要一个字符(2个字节),而需要3个字节?
EN

Stack Overflow用户
提问于 2017-03-10 03:55:19
回答 1查看 15.5K关注 0票数 6

我有以下程序来测试Java如何处理汉字:

代码语言:javascript
复制
String s3 = "世界您好";
char[] chs = s3.toCharArray();
byte[] bs = s3.getBytes(StandardCharsets.UTF_8);
byte[] bs2 = new String(chs).getBytes(StandardCharsets.UTF_8);

System.out.println("encoding=" + Charset.defaultCharset().name() + ", " + s3 + " char[].length=" + chs.length
                + ", byte[].length=" + bs.length + ", byte[]2.length=" + bs2.length);

打印出来的是:

编码=UTF-8,世界您好char[].length=4,byte[].length=12,byte[]2.length=12

其结果是:

  1. 如果使用char保存汉字,则一个汉字需要一个char[],即Java中的2个字节;
  2. 如果使用byte来保存汉字,一个汉字需要3 byte[] s;

我的问题是,如果两个字节足够,为什么我们使用3个字节?如果两个字节不够,为什么我们使用两个字节?

编辑:

我的JVM的默认编码设置为UTF-8。

EN

回答 1

Stack Overflow用户

发布于 2017-05-22 22:39:19

Java char类型将16位数据存储在一个两个字节的对象中,使用每个位来存储数据。不会这么做的。对于汉字,UTF-8只使用每字节6位来存储数据.另外两位包含控制信息。(根据人物的不同而不同。对于ASCII字符,UTF-8使用7位.)这是一个复杂的编码机制,但它允许UTF-8存储长达32位的字符.这样做的优点是,对于7位( ASCII )字符,每个字符只接受一个字节,这使得它与ASCII向后兼容。但是它需要3个字节来存储16位数据。通过在维基百科上查找它,你可以了解它是如何工作的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42709916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档