编码问题

##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" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏