知识图库
Java知识库
JDK线程池实现原理
Java中的强、软、弱、虚引用
深入拆解Java虚拟机
01 开篇词 | 为什么我们要学习Java虚拟机?
02 Java代码是怎么运行的?
03 Java的基本类型
04 Java虚拟机是如何加载Java类的?
05 JVM是如何执行方法调用的?(上)
06 JVM是如何执行方法调用的?(下)
7 JVM是如何处理异常的?
Java面试常见问题整理
Java面试常见问题-Java 基础篇
Java面试常见问题-Jvm篇
Java面试常见问题-并发篇
Android知识库
Kotlin编程第一课
1 开篇词 | 入门Kotlin有多容易,精通Kotlin就有多难
2 Kotlin基础语法:正式开启学习之旅
3 面向对象:理解Kotlin设计者的良苦用心
4 Kotlin原理:编译器在幕后干了哪些“好事”?
5 实战:构建一个Kotlin版本的四则运算计算器
6 object关键字:你到底有多少种用法?
7 扩展:你的能力边界到底在哪里?
8 高阶函数:为什么说函数是Kotlin的“一等公民”?
9 实战:用Kotlin写一个英语词频统计程序
10 加餐一 | 初识Kotlin函数式编程
11 委托:你为何总是被低估?
12 泛型:逆变or协变,傻傻分不清?
13 注解与反射:进阶必备技能
14 实战:用Kotlin实现一个网络请求框架KtHttp
15 加餐二 | 什么是“表达式思维”?
16 加餐三 | 什么是“不变性思维”?
17 加餐四 | 什么是“空安全思维”?
18 春节刷题计划(一)| 当Kotlin遇上LeetCode
19 春节刷题计划(二)| 一题三解,搞定版本号判断
20 春节刷题计划(三)| 一题双解,搞定求解方程
21 春节刷题计划(四)| 一题三解,搞定分式加减法
22 什么是“协程思维模型”?
23 如何启动协程?
24 挂起函数:Kotlin协程的核心
25 Job:协程也有生命周期吗?
26 Context:万物皆为Context?
27 实战:让KtHttp支持挂起函数
28 期中考试 | 用Kotlin实现图片处理程序
29 题目解答 | 期中考试版本参考实现
30 Channel:为什么说Channel是“热”的?
31 Flow:为什么说Flow是“冷”的?
32 select:到底是在选择什么?
33 并发:协程不需要处理同步吗?
34 异常:try-catch居然会不起作用?坑!
35 实战:让KtHttp支持Flow
36 答疑(一)| Java和Kotlin到底谁好谁坏?
37 集合操作符:你也会“看完就忘”吗?
38 协程源码的地图:如何读源码才不会迷失?
39 图解挂起函数:原来你就是个状态机?
40 加餐五 | 深入理解协程基础元素
41 launch的背后到底发生了什么?
42 Dispatchers是如何工作的?
43 CoroutineScope是如何管理协程的?
44 图解Channel:如何理解它的CSP通信模型?
45 图解Flow:原来你是只纸老虎?
46 Java Android开发者还会有未来吗?
47 Kotlin与Jetpack简直是天生一对!
48 用Kotlin写一个GitHub Trending App
49 结课测试 | “Kotlin编程第一课”100分试卷等你来挑战!
50 结束语 | 不忘初心
Android Framework 教程—基础篇
01 Ubuntu 使用快速入门
02 Make 构建工具入门
03 理解 Unicode UTF-8 UTF-16 UTF-32
04 Linux Shell 脚本编程入门1——核心基础语法
05 SeAndroid 使用极速上手
06 理解 C++ 的 Memory Order
07 AOSP 极速上手
08 系统开发工具推荐
09 添加 Product
运动相关知识
爱上跑步
01 开篇词 | 跑步,不那么简单的事儿
02 跑两步就喘了,是不是我不适合跑步?
03 正确的跑步姿势是什么样的?
04 为什么跑步要先热身?
05 怎样制定你的第一个10公里跑步计划?
06 快跑和慢跑,哪个更燃脂?
07 普通跑步者应该如何选择跑鞋?
08 买跑步装备,不要踩这些坑儿
09 跑步前到底应不应该吃东西?
10 跑步到底伤不伤膝盖?
11 参加了20场马拉松,我是如何准备的?
12 除了马拉松,还能参加哪些跑步赛事?
13 热点问题答疑 :跑完第二天浑身疼,还要不要继续跑?
健身房计划
[DeepSeek]减脂塑形计划
【DeepSeek】训练周期安排
每日餐饮热量控制
减脂期间食物推荐避坑指南
HarmonyOS知识库
其他知识类目
心理学相关
如何学点心理学——关于非专业人士学心理学的一点建议
投射性认同
-
+
首页
03 理解 Unicode UTF-8 UTF-16 UTF-32
Unicode 是一个字符集,其中包含了一百多万个字符。每一个字符都分配了一个唯一的 ID,这个 ID 学名叫做 Code Point。Code Point 的范围为 0x0000-0x10FFFF。规定使用 "u+十六进制数字" 来表示 Code Point,例如 "u+4E2D" 表示汉字中的 "中" 字的 Code Point。 ### UTF-32 信息从一种形式或格式转换为另一种形式的过程称之为编码。 接下来的问题就是如何对 Code Point 进行编码使其便于计算机存储和处理。 最简单的办法就是直接存储 Code Point 的二进制值。Code Point 的最大值为 0x10FFFF,最少需要 3 个字节才能存储。考虑到后续可能的变动,我们干脆就使用 4 个字节来存储。 上面的过程就是最简单的编码方式(不变),称之为 UTF-32。编码后的字节序列称之为 Code Unit。 具体的编码规则如下: ```yaml u+0000 ~ u+10FFFF: xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx ``` ### UTF-16 UTF-32 对于 Code Point 较小的字符,也需要四个四节来存储。这样虽然简单,但是浪费了空间。 容易想到 Code Point 小点的字符用两个字符表示,大点的字符用四个字符表示,具体规则如下: - 对于 Code Point 小于 0x10000 的字符,使用2个字节存储,并且是直接存储Unicode 码。 - 对于 Code Point 在 Ox10000 和 Ox10FFFF 之间的字符,使用4个字节存储,这4个字节分成前后两部分,每个部分各两个字节,其中,前面两个字节的前6位二进制固定为110110,后面两个字节的前6位二进制固定为110111,前后部分各剩余10位二进制表示符号的 Unicode 码减去Ox10000的结果。 ```yaml u+ 0000 ~ u+ FFFF: xxxxxxxx xxxxxxxx u+10000 ~ u+10FFFF: 110110xx xxxxxxxx 110111xx xxxxxxxx (x 位表示 Code Point 减去Ox10000的结果) ``` 上面的编码方式,称之为 UTF-16。 ### UTF-8 相同的思路,我们可以将 Code Point 区间进一步细分: ```yaml U+ 0000 ~ U+ 007F: 0XXXXXXX U+ 0080 ~ U+ 07FF: 110XXXXX 10XXXXXX U+ 0800 ~ U+ FFFF: 1110XXXX 10XXXXXX 10XXXXXX U+10000 ~ U+10FFFF: 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX ``` 根据上表中的编码规则,「知」字的码位 U+77E5 属于第三行的范围: ```shell 7 7 E 5 0111 0111 1110 0101 二进制的77E5 -------------------------- 0111 011111 100101 二进制的77E5 1110XXXX 10XXXXXX 10XXXXXX 模版(上表第三行) 11100111 10011111 10100101 代入模版 E 7 9 F A 5 ``` 这就是将 U+77E5 编码为字节序列 E79FA5 的过程。以上的编码方式称之为 UTF-8 ### 总结 - Unicode是「字符集」 - UTF-8、UTF-16、UTF-32等是「编码规则」 其中: - 字符集:为每一个「字符」分配一个唯一的 ID (Code Point) - 编码规则:将「Code Point」转换为字节序列的规则,转换后的字节序列称之为 「Code unit」。 广义的 Unicode 是一个标准,定义了一个字符集以及一系列的编码规则,即 Unicode字符集和 UTF-8、UTF-16、UTF-32 等编码规则。通过这些编码规则一个码位(Code Point)就会对应一个编码,这个编码就称为 Code Unit。 ### 参考资料: [Unicode、UTF-8、UTF-16 终于懂了](https://link.juejin.cn/?target=https%3A%2F%2Fos.51cto.com%2Farticle%2F661981.html) [《Java 核心技术 卷一》](https://link.juejin.cn/?target=https%3A%2F%2Fbook.douban.com%2Fsubject%2F34898994%2F) [Unicode 和 UTF-8 有什么区别?](https://link.juejin.cn/?target=https%3A%2F%2Fwww.zhihu.com%2Fquestion%2F23374078%2Fanswer%2F69732605)
嘿手大叔
2025年1月2日 19:17
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码