• Java 为什么能给 char 类型赋值中文字符
  • 发布于 1个月前
  • 101 热度
    5 评论
java 文档里有写 一个 char 由两个自己组成 但一个 utf8 汉字由三个字节组成
为什么这样赋值没事?
char a = '我';
用户评论
  • APAC
  • 稍微偏个题
    其实你 c 语言里也可以这么写,而且有实际用处(不过一般不是中文,而是四个英文字母组成的字面量,类似 enum State { stop = 'stop' }这样的用法,然后就可以在内存里见到这个字面量了,简易调试的时候很有用(不过有字节序的问题,所以现在也不常用)
  • 2025/2/10 12:02:00 [ 0 ] [ 0 ] 回复
  • 弄潮儿
  • 因为 char 是 16 位无符号整数,用来表示 UTF-16 码位。而 UTF-16 本身是 2 字节或者 4 字节的变长编码,“我”是在 BMP 里的,所以只需要 2 字节即可表示。如果你从扩展 B 区找一个汉字,就会发现它是不能被赋值给 char 的。
  • 2025/2/10 11:58:00 [ 0 ] [ 0 ] 回复
  • 原木风
  • 根据 java 核心技术卷说的,char 类型采用 utf16 编码规则,char 描述 utf16 编码规则中的一个代码单元,一些中文用 utf16 编码规则的时候一部分是占用 2 字节-一个代码单元,一部分是 4 字节,2 个代码单元。
  • 2025/2/10 11:54:00 [ 0 ] [ 0 ] 回复
  • 李明发
  • “一个 char 由两个字节组成 但一个 utf8 汉字由三个字节组成”,这句话本身没有问题,但代码里的 char 变量和这句话里的 char 不是一回事.。
    字符的本质就是一个整数,比如“我”的编码是 25105 ,几乎所有程序在运行时都会直接存储 25105 。
    编译器同理,无论源码里面是什么,用什么编码,最后都会统一解析出 25105 这个数值。
    java 的 char 类型本质是一个 16 位整数。char a = '我'; 本质等价于 short a = 25105 。显然没有问题。
    所以这个问题其实和“Unicode”、“UTF-8”没有任何关系、更不要去扯什么文件编码,那只会越扯越糊涂。
  • 2025/2/10 11:50:00 [ 0 ] [ 0 ] 回复
  • 日光微暖
  • 你把语言里类型的字长跟存储时编码的存储方案搞混了。在 Java 语言里,你把一个中文的字符串取一下长度看是不是 1 ,跟 char 能不能对上,结论就出来了。
  • 2025/2/10 9:21:00 [ 0 ] [ 0 ] 回复