要想弄清楚char占用几个字节,就必须了解Unicode编码机制。
早在Unicode诞生之前,就已经有很多字符集,如美国的ASCII、表示西欧语言的ISO 8859-1、中国的GB18030等。
但是世界上始终没有一种字符集,容纳了全世界所有的语言,这就产生了一个问题:如果你有一个里面用十几种不同语言写的内容,没有一种字符集能够完全正确显示这个文件。
Unicode编码的目的就是要解决这个问题。
一开始设计Unicode编码只有2字节,因为当时认为认为两字节的代码宽度足以对世界上各种语言的所有字符进行编码。并有足够的空间留给未来扩展。然后不幸的是,在引入大量汉语、日语和韩语的表意文字后,Unicode字符超过了65536个,两个字节已经完全不够用!
如何解决这个问题呢?
我们先了解一个概念:**码点(code point)是指一个编码表中某个字符对应的代码值。**如在ASCII表中a的码点是97。在Unicode中,码点用十六进制表示,使用UTF-16编码。

Unicode的码点分为17个代码级别,第一个级别称为基本的多语言级别,使用一个代码单元进行编码表示,其余的16个级别使用一对连续的代码单元表示。而代码单元是UTF-16的编码单位,一个是16位,也就是2字节。简而言之就是有的Unicode的码点是需要两个字节来表示,有的需要四个字节。后者表示的字符被称为辅助字符
那么当计算机进行编码的时候,每读取两个字节(一个代码单元),这两个字节代表的是一个需要两字节表示的码点,还是一个需要四字节表示的码点的一部分呢?
Unicode规定,第一级别的码点从U+0000到U+FFFF,而辅助字符的码点范围是U+10000到U+10FFFF。也就是说,当读取到两个字节,如果这两字节在U+0000到U+FFFF那么可以直接编码成一个字符,而如果在后者,则代表这两字字节只是辅助字符的第一或第二部分,还需要与另外的两个字节组合,才是一个完整的字符。
而在Java中**,char类型描述了UTF-16编码中的一个代码单元(2字节)**。
所以强烈建议不要再程序中使用char类型,除非确实需要处理UTF-16代码单元。涉及到字符,最好使用String。

参考:Java核心技术卷Ⅰ第10版

Java中char类型占几个字节?相关推荐

  1. java中double类型占几个字节_面试官:Java 中有几种基本数据类型是什么?各自占用多少字节?...

    认识基本数据类型 在学习基本数据类型之前,我们先认识一下这两个单词:1.bit --位:位是计算机中存储数据的最小单位,指二进制数中的一个位数,其值为"0"或"1&quo ...

  2. java中double类型占几个字节_java中各种数据类型占用字节数

    1字节(Byte)=8bit java的基本类型 类型 所占字节 byte 1 short 2 int 4 long 8 float 4 double 8 char 2 String中字母和汉字所占字 ...

  3. java中char到底占几个字节的问题

    前些天被问到一个问题:java中一个char可以表示一个汉字吗? 我一想char不是占一个字节吗?汉字在utf-8中占三个字节(还有四字节的),char不能够表示!对方一笑,让我后面查查 所以网上搜了 ...

  4. java中boolean类型占几个字节

    java的基本数据类型中,boolean只有两种状态,默认值为false.取值范围是{true,false},理论上占1bit,实际上: 1.单个的boolean 类型变量在编译的时候是使用的int ...

  5. java中float类型占4个字节,long类型占8个字节,为什么long类型能自动转换成float类型,且float类型为什么表示的范围比long类型大

    作为常识我们都知道,float型在内存中占用的是4个字节,而long型占用8个字节.单从字节数来看,long型是大于float型的.但实际上,float表示的范围却是比long要大的 float类型的 ...

  6. java char 计算_经典Java面试题之Java中Char类型的运算

    经典Java面试题之Java中Char类型的运算 char在java中称为"字符型",占2个字节.本文是百分网小编搜索整理的关于经典Java面试题之Java中Char类型的运算,有 ...

  7. java中char类型可以存储两个中文字符吗

    java中char类型只能存储一个中文字符 https://www.cnblogs.com/lchzls/p/7071862.html https://blog.csdn.net/qq_4264294 ...

  8. Java基础题37:(单选题)java中char类型的取值范围是() A.0 ... 32767 B.0 ... 65535

    37.(单选题)java中char类型的取值范围是() A.0 - 32767 B.0 - 65535 C.–256 - 255 D.–32768 - 32767 [正确答案]B [答案解析]在jav ...

  9. Java中char类型数组打印数组名输出结果不是地址值

    Java中其他类型数组打印数组名,输出结果都是内存地址 Java中char类型数组打印数组名,输出结果不是内存地址 char类型的数组就相当于一个字符串. 因为输出流System.out是PrintS ...

最新文章

  1. [导入]使用SqlCommand对象执行存储过程
  2. 【JVM】垃圾回收器
  3. 21. 栈的压入、弹出序列
  4. cad快速看图 2021
  5. HCSE交换知识重点
  6. 计算机名字好听的,好听的昵称大全
  7. Python爬虫120例之案例58,手机APP爬虫,“武器库”的准备and皮皮虾APP的测试
  8. 吴恩达授课,斯坦福CS230深度学习课程资源开放
  9. LPMS1000-全自动压力校验系统
  10. shell脚本练习(随机取名)
  11. 【航线运输驾驶员理论考试】气象学
  12. 商城系统面试题(二)
  13. Linux运维之道-基础命令
  14. 干货 | 诚迈科技联合联发科技、Linaro推出《Make it happen!联发科技曦力X20开发板技术公开课(上海站)》精彩回顾
  15. 户外测量工具“Moasure魔尺”登录国内,一款神奇的测量工具
  16. 3D旋转木马--文字效果(源码)
  17. 大数据专业怎么样?是什么?
  18. [1007]魔法少女小Scarlet
  19. 佳能Canon PIXMA iP1188 打印机驱动
  20. 天津理工大学信息论与编码实验(1)

热门文章

  1. linux Ubuntu将默认bash修改为csh
  2. 同文输入法 android,同文输入法无障碍版
  3. python算法设计 - 埃拉托色尼筛选法
  4. MySQL报错:The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone
  5. Ubuntu18.04配置carla0.9.11踩坑与解决方法总结,同时解决安装carla-ros-bridge遇到的问题,并复现OpenCDA成功与ros关联
  6. 基于Vue实现头像选择预览
  7. win10安装centos7、安装显卡驱动和cuda、安装mpich全流程
  8. linux 6 yum配置,redhat 6(centos 6)配置 yum 源的两种方法
  9. Window对象详解
  10. 【Unity VR开发】VRTK 3.3.0 配置与基本使用