Java 为什么能给 char 类型赋值中文字符

4 天前
 zhouyin
java 文档里有写 一个 char 由两个自己组成 但一个 utf8 汉字由三个字节组成
为什么这样赋值没事?

char a = '我';
4249 次点击
所在节点    Java
65 条回复
cmdOptionKana
4 天前
问了一下 deepseek ,它说:UTF-8 编码的汉字在 Java 中会自动转换为 UTF-16 编码,因此赋值时不会出现问题。
theoriz
4 天前
@Livid #1 AI
soulflysimple123
4 天前
char 是 utf-16 编码
tbc3211
4 天前
魔怔
zhouyin
4 天前
@soulflysimple123
输入法输入的汉字是三个字节 编译器自动把汉字转成 utf16 进行存储了
maocat
4 天前
@theoriz 哥们你魔怔了吧,人家是把 ai 的提炼了一遍,一眼就能看清说啥,而不是 ai 的长篇大论,你这也举报?
sagaxu
4 天前
一个 char 不够那就两个啊,code point 是 int 类型,超出 BMP 的字符不能用单个 char 表示,要用两个 char 组合
Fca
4 天前
@theoriz 有文革那味了 人人自危
zhouyin
4 天前
神奇的是 把变量用 FileWriter.write 方法 写入到文件 还是 3 个字节
zhouyin
4 天前
@zhouyin
可能因为默认编码 utf-8
zhouyin
4 天前
@zhouyin
FileWriter 默认 iso-8859-1 编码 单字节
zhouyin
4 天前
@zhouyin
java17 filewriter 默认 encoding utf8
dandycheung
4 天前
你把语言里类型的字长跟存储时编码的存储方案搞混了。在 Java 语言里,你把一个中文的字符串取一下长度看是不是 1 ,跟 char 能不能对上,结论就出来了。
zhouyin
4 天前
@dandycheung

没搞混哦 你的回答比较低级

我如果这都不知道 就不会问底层的字节了

这帖的精华是 编译器把输入的 utf8 汉字的三个字节 主动隐式地换成了 2 个字节 utf16 了
dandycheung
4 天前
总之就是,Java 语言用两个字节存储一个 char ,而一个汉字在 UTF-8 编码后有三个字节长,但是它仍然是一个 char ,在 Java 语言中占用两个字节;一个英文字母在 UTF-8 编码后是一个字节长,但它也是一个 char ,在 Java 语言中占用两个字节。

有没搞混无所谓了,你自己判断就好。
wuyiccc
4 天前
那你看看这个中文汉字 '𠮷' 还能赋值么
sagaxu
4 天前
@zhouyin
@dandycheung

2 字节上限只有 65536 个字符,但 unicode 已经超过 10 万个字符了。
wind1986
4 天前
@theoriz 你怕是有什么大病吧?
xuld
4 天前
“一个 char 由两个字节组成 但一个 utf8 汉字由三个字节组成”,这句话本身没有问题,但代码里的 char 变量和这句话里的 char 不是一回事.。

字符的本质就是一个整数,比如“我”的编码是 25105 ,几乎所有程序在运行时都会直接存储 25105 。

编译器同理,无论源码里面是什么,用什么编码,最后都会统一解析出 25105 这个数值。

java 的 char 类型本质是一个 16 位整数。char a = '我'; 本质等价于 short a = 25105 。显然没有问题。

所以这个问题其实和“Unicode”、“UTF-8”没有任何关系、更不要去扯什么文件编码,那只会越扯越糊涂。
wuyiccc
4 天前
根据 java 核心技术卷说的,char 类型采用 utf16 编码规则,char 描述 utf16 编码规则中的一个代码单元,一些中文用 utf16 编码规则的时候一部分是占用 2 字节-一个代码单元,一部分是 4 字节,2 个代码单元

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/1110066

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX