
码点Code Point是 Unicode 标准中为每一个字符分配的唯一数字编号。你可以把它理解为字符在 Unicode 这个超级字典里的身份证号。不管这个字符用什么编码方式存储UTF-8、UTF-16、UTF-32它的码点永远不变。 长什么样码点通常用U前缀加十六进制数表示字符码点说明AU0041基本拉丁字母中U4E2DCJK 统一汉字U1F600增补平面 emojiU1D11E音乐符号关键认知码点是抽象的逻辑概念和具体的字节存储无关。U1F600就是笑脸这个字符本身至于它占 2 个 char 还是 4 个字节那是编码方案的事。 码点 vs char vs 字节这是最容易混淆的三个概念概念本质大小例子码点字符的唯一编号0 ~ 0x10FFFFU1F600charJava/UTF-16 的编码单元固定 16 bit\uD83D\uDE00两个 char字节实际存储/传输的最小单位取决于编码UTF-8: 4字节UTF-16: 4字节一句话区分码点回答的是这是什么字符char/字节回答的是怎么存/怎么传 Unicode 的码点空间Unicode 定义了0x0 ~ 0x10FFFF共 1,114,112 个码点位置分为 17 个平面BMP基本多文种平面U0000 ~ UFFFF → 包含中文、英文、日文等常用字符 →1 个 char 就能表示增补平面1~16U10000 ~ U10FFFF → 包含 emoji、生僻字、历史文字等 →需要 2 个 char代理对才能表示这就是你之前学代理对的根源码点空间大于单个 char 的表达能力所以超出 BMP 的码点必须用两个 char 来编码。 为什么你需要关心码点因为所有字符串操作的语义都应该基于码点而不是 char用户名最多10个字 → 10 个码点不是 10 个 char截取前5个字符 → 前 5 个码点这个字符串有几个字 → 码点数量数据库VARCHAR(10)→ 不同数据库行为不同有的按码点有的按字节必须确认终极记忆码点 字符 用户眼中的一个字。写代码时凡是涉及字符数的逻辑脑子里想的应该是码点而不是char。