编码问题
##ASCII 码
- 最开始出现的编码
- 8 位 2 进制,一个字节,共可以有 256 种状态
- ASCII 码规定了 128 个字符编码,统一的第一位为 0
英语一个字节就够了
但是中文就需要两个字节,常用的 GB2312
但是就算使用两个字节表示一个汉字,也就是 60000 多的情况
##unicode
unicode 应运而生
范围很大,可以容纳 100 多万
每个字符的编码都不一样
只规定了二进制代码,并没有规定如何存储
- 无法区别是几个符号
- 如果统一规定了 4 个符号的话,会造成浪费
##UTF-8
这是 Unicode 的实现方式之一
变长的编码方式,可以使用 1~4 个字节表示一个符号
使用了下面的编码规则就可以区分并且分别是几个符号
- 对于单字节符号,字节第一位为 0,后 7 位为 unicode 码,因而对于英文字母,UTF-8 与 ASCII 相同
- 对于 n 字节,第一个字节的前 n 位都是 1,第 n+1 为 0,后面字节的前两位一律为 10,剩下的没有提及的位,则为这个符号的 unicode 码。
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
例如严字
unicode 是 4E25(100111000100101),根据上表,可以发现 4E25 处在第三行的范围内(0000 0800-0000 FFFF),因此”严”的 UTF-8 编码需要三个字节,即格式是”1110xxxx 10xxxxxx 10xxxxxx”。然后,从”严”的最后一个二进制位开始,依次从后向前填入格式中的 x,多出的位补 0。这样就得到了,”严”的 UTF-8 编码是”11100100 10111000 10100101”,转换成十六进制就是 E4B8A5。
todo:配合正则那里的再看一下
参考自阮一峰的编码规则
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 981909093@qq.com
文章标题:编码问题
文章字数:488
本文作者:泽鹿
发布时间:2019-08-28, 16:45:23
最后更新:2019-08-28, 20:10:03
原始链接:http://panyifei.github.io/2019/08/28/技术/其他技术/编码问题/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。