https://blog.csdn.net/xiaolei1021/article/details/52093706
Unicode, 又称万国码, 规定了符号与二进制码的对应关系, 没有规定二进制码的保存方式.
假如,'a'的 Unicode 码为 0x0d12,'b'的 unicode 码为 0x23d4; 给 0x od12 23d4, 并不能够解读为
'ab', 因为 0x od12 23d4 在 unicode 码表中表示为另一个符号.
那么, 我们就要规定 unicode 的二进制吗的存储方式, UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式.
utf-8 是一种 变长的 编码方式, 为了节约内存资源, 英文数字采用 1 字节保存 (兼容 ascii 编码), 中文一般 3 字节保存.
UTF-8 的编码规则很简单, 只有二条:
1) 对于单字节的符号, 字节的第一位设为 0, 后面 7 位为这个符号的 unicode 码. 因此对于英语字母, UTF-8 编码和 ASCII 码是相同的.
2) 对于 n 字节的符号 (n>1), 第一个字节的前 n 位都设为 1, 第 n+1 位设为 0, 后面字节的前两位一律设为 10. 剩下的没有提及的二进制位, 全部为这个符号的 unicode 码.
下表总结了编码规则, 字母 x 表示可用编码的位.
Unicode 符号范围 | UTF-8 编码方式
- (十六进制) | (二进制)
- --------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
跟据上表, 解读 UTF-8 编码非常简单. 如果一个字节的第一位是 0, 则这个字节单独就是一个字符; 如果第一位是 1, 则连续有多少个 1, 就表示当前字符占用多少个字节.
下面, 还是以汉字 "严" 为例, 演示如何实现 UTF-8 编码.
已知 "严" 的 unicode 是 4E25(100111000100101), 根据上表, 可以发现 4E25 处在第三行的范围内 (0000 0800-0000 FFFF), 因此 "严" 的 UTF-8 编码需要三个字节, 即格式是 "1110xxxx 10xxxxxx 10xxxxxx". 然后, 从 "严" 的最后一个二进制位开始, 依次从后向前填入格式中的 x, 多出的位补 0. 这样就得到了,"严" 的 UTF-8 编码是 "11100100 10111000 10100101", 转换成十六进制就是 E4B8A5.
来源: http://www.bubuko.com/infodetail-2582301.html