未登录用户
首 页
书 架
登录系统
注册账号
联系我们
duidaima.com
版权声明
闽ICP备2020021581号
闽公网安备 35020302035485号
搜索
我要提问
随便写写
我要写书
Java 为什么能给 char 类型赋值中文字符
发布于 1个月前
101 热度
5 评论
桃花易落
0 粉丝 27 篇博客
关注
打赏
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
]
回复
点击加载更多评论
JAVA编程
236 成员 |
982 话题
+我要提问
+随便写写
可能感兴趣的话题
如何使用SpringBoot AOP + Redis实现延时双删功能
大家觉得Java 味是什么味?
String 能存储多少个字符?
如何使用Function接口重构简化代码
其实你 c 语言里也可以这么写,而且有实际用处(不过一般不是中文,而是四个英文字母组成的字面量,类似 enum State { stop = 'stop' }这样的用法,然后就可以在内存里见到这个字面量了,简易调试的时候很有用(不过有字节序的问题,所以现在也不常用)
字符的本质就是一个整数,比如“我”的编码是 25105 ,几乎所有程序在运行时都会直接存储 25105 。
编译器同理,无论源码里面是什么,用什么编码,最后都会统一解析出 25105 这个数值。
java 的 char 类型本质是一个 16 位整数。char a = '我'; 本质等价于 short a = 25105 。显然没有问题。
所以这个问题其实和“Unicode”、“UTF-8”没有任何关系、更不要去扯什么文件编码,那只会越扯越糊涂。