42 条回复  ·  4484 次点击
wuyiccc 小成 2025-2-9 14:23:07
根据 java 核心技术卷说的,char 类型采用 utf16 编码规则,char 描述 utf16 编码规则中的一个代码单元,一些中文用 utf16 编码规则的时候一部分是占用 2 字节-一个代码单元,一部分是 4 字节,2 个代码单元
moposx 初学 2025-2-9 14:24:11
因为 char 是 16 位无符号整数,用来表示 UTF-16 码位。而 UTF-16 本身是 2 字节或者 4 字节的变长编码,“我”是在 BMP 里的,所以只需要 2 字节即可表示。如果你从扩展 B 区找一个汉字,就会发现它是不能被赋值给 char 的。
wuyiccc 小成 2025-2-9 14:25:08
补充: char 类型不是采用 utf16 编码规则,而是描述了 UTF-16 编码中的一个代码单元
zhouyin 楼主 小成 2025-2-9 14:25:42
@xuld 你才是菜鸟 不知道编辑器当前 utf8 编码下 输入一个汉字会插入三个字节 在源代码保存的就是三个字节 只是编译器转成了 utf16 两个字节 你其实没有理解精髓
zhouyin 楼主 小成 2025-2-9 14:27:19
@wuyiccc 对 一般 utf16 是 4 个字节 我还在奇怪 为什么 java unicode 两个字节
zhouyin 楼主 小成 2025-2-9 14:47:47
@wuyiccc 该字能在 java17 赋值给 char 但只能通过位移得到 2 个有用字节 如果 String.valueOf(a).getBytes("UTF-16") 则得不到有用东西 必须赋值给 String 才能处理 这个字的四个字节在此码表网站显示不出来 https://www.toolhelper.cn/Encoding/UTF16 D842 DFB7
zhouyin 楼主 小成 2025-2-9 14:53:36
@wuyiccc 在 java16 及以上 可以把这种超出两字节的汉字 赋值给 char 但得不到正确 bytes
zhouyin 楼主 小成 2025-2-9 15:03:51
@wuyiccc 该字通过 string.getBytes("UTF-8") 得到 4 个字节 其实它在 utf8 下 http://www.mytju.com/classCode/tools/encode_utf8.asp 是 6 个字节
zhouyin 楼主 小成 2025-2-9 15:13:58
@wuyiccc 对应 utf8 编码 fa a0 ae b7 能在编辑器中正常显示 可能网站 mytju 给出的 utf8 不准确
w568w 小成 2025-2-9 15:23:46
这种涉及具体设计的东西,为什么不直接看文档呢: https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/lang/Character.html#unicode 太长不看: char 数据类型基于 Unicode 规范,该规范将字符( characters )定义为固定宽度的 16 位实体。从 U+0000 到 U+FFFF 的字符集有时被称为基本多语言平面 (Basic Multilingual Plane ,BMP)。码位大于 U+FFFF 的字符称为补充字符( supplementary characters )。UTF-16 编码这些补充字符的方式是,利用一对 16 位整数(称为「代用码位」), 第一个来自高代用值范围(\uD800-\uDBFF ),第二个来自低代用值范围(\uDC00-\uDFFF )。 因此,一个 char 值代表基本多语言平面中的一个码位,包括 UTF-16 编码使用的代用码位。为了表示那些在 UTF-16 中需要多码位编码的补充字符们(如部分汉字、符号等),将用 int 类型来代表一个完整 Unicode 码位。 因此,那些接受 char 类型的字符串工具函数,将无法处理补充字符;而接受 int 类型的那些,就可以处理所有字符。
返回顶部