编码原理理解之「UTF-8」
UTF-8 (8位元, Universal Character Set/Unicode Transformation Format )是针对Unicode的一种可变长度字符编码。它可以用来表示 Unicode 标准中的任何字符,而且其编码中的第一个字节仍与 ASCII 相容,使得原来处理 ASCII 字符的软件无须或只进行少部份修改后,便可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。
总结下来, UTF8 有如下特点:
1)是 unicode 的一种实现方式;
2)是一种变长编码标准;
3)可以与 ASCII 码有效兼容;
4)应用超级广泛编码标准。
我们讲, UTF-8 是 unicode 的一种实现方式,那么,想要对一个字符进行 UTF-8 编码,首先我们要知道这个字符的 unicode 编码(字符的 unicode 编码是约定好的,全球统一不变的)。拿 unicode 编码的方式很简单,网上有很多 工具 可以做到。
接下来针对不同的 unicode 符号范围, utf-8 编码实际占用的字节数可能 1~4 字节不等👇
总结下来,针对 UTF8 ,编码规则其实只有两条:
1) 单字节规则: 对于 单字节 的符号,字节的第一位(最高位)设为 0 ,后面 7 位为这个符号的 unicode 码。
2) n字节规则: 对于 n 字节的符号( n>1 ),第一个字节的前 n 位都设为 1 ,第 n+1 位设为 0 ,后面字节的前两位一律设为 10 。剩下的没有提及的二进制位,全部为这个符号的 unicode 码。
以 「真」 举例,我们查到 「真」 的 unicode 编码是 \u771f ( \u 只是 unicode 的编码标记,其后面跟的还是 16 进制数),发现真的编码范围是 0x0800 ~ 0xffff 间,故选择 3字节 的编码方式👇
我们将 0x771f 转化为2进制(共16位),并分成 4、6、6 三组,填入👆编码方式的 「x」 的位置,得到 1110 0111 10 011100 10 011111 ,至此完成 「真」 的 utf-8 编码,转化为 16 进制描述即: 0xe79c9f 。
那么,有 mac 的小伙伴可以试试我提供的一套基于 iOS 的编码理解工程。可以快速打印出一段文本编码的数据结果( 16 进制、 2 进制都有),示例如下:
git地址: https://github.com/chrisYooh/CYEncoding.git
对你有帮助的话记得帮我点个 「Star」 哦! 😊✨✨✨
2024-09-04 广告