ASCII,Unicode 和 UTF-8

0 预备知识

bit:位,一个位就代表一个 0 或 1,二进制单位。数据传输大多是以“位”为单位,例如:100Mbps 即 Mbit/s,兆比特每秒。
byte:字节,计算机中用于计量存储容量的一种计量单位。

关系:8 bits = 1 byte

bit-byte.png

1 ASCII

ASCII,/ˈæski/,American Standard Code for Information Interchange
美国信息交换标准代码

每一个 bit 有 0 和 1 两种状态,因此八个二进制位就可以组合出 256 种状态,这被称为一个 byte。也就是说,一个字节一共可以用来表示 256 种不同的状态,每一个状态对应一个符号,就是 256 个符号,从 0000000 到 11111111。

ASCII 码一共规定了 128 个字符的编码(ASCII 对照表),这 128 个符号只占用了一个字节的后面 7 位,最前面的 1 位统一规定为 0。

英语字母及一些符号用 128 个符号编码就足够了,但是用来表示其他语言,128 个符号是远远不够。

2 Unicode

Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

2.1 编码

在表示一个 Unicode 字符时,通常会用 U+ 然后紧接着一组十六进制的数字来表示这一个字符。例如:U+0041 表示英语大写字母 AU+4E25 表示汉字 “严”。

2.2 实现

Unicode 是一个符号集。Unicode 的实现方式不同于编码方式。一个字符的 Unicode 编码是确定的,但是在实际传输过程中,由于不同系统平台的设计不一定一致,对 Unicode 编码的实现方式有所不同。Unicode的实现方式称为 Unicode 转换格式(Unicode Transformation Format,简称为 UTF)。

2.3 问题

Unicode 字符的十六进制数转换成二进制数时,一般用 2 个字节表示 1 个字符,表示其他更偏的字符,可能需要 3 或 4 个字节,甚至更多。

如果一个仅包含 7 bits 的 ASCII 字符(例如一个英文字母)使用 Unicode 编码,如果 Unicode 统一规定每个字符都使用 2 个或更多字节表示,那么这些字节中前几个字节就必然要补 0。虽然乱码问题得到解决,但是这对于存储来说是极大的浪费。
例如:字母 A 的 Unicode 二进制编码是 00000000 01000001

3 UTF-8

UTF-8 是 Unicode 的一种实现方式。其他实现方式还包括 UTF-16 和 UTF-32。

UTF-8 是一种变长编码,根据具体字符来变更所需的表示字节。它将基本 7 位 ASCII 字符仍用 7 位编码表示,占用一个字节(首位补 0)。而遇到与其他 Unicode 字符混合的情况,将按一定算法转换,每个字符使用 1-3 个字节编码,并利用首位为 0 或 1 进行识别。这样对以 ASCII 字符为主的英文文档就大幅节省了编码长度。

3.1 规则

UTF-8 的编码规则只有二条:

  1. 对于 128 个 ASCII 字符只需一个字节表示,字节的第一位补 0,后面 7 位为这个字符的 ASCII 二进制数。Unicode 范围为 U+0000 至U+007F。

  2. 对于 n 字节的符号(n>1),第一个字节的前 n 位都设为 1,第 n+1 位设为 0,后面字节的前两位一律设为 10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码二进制数。Unicode 范围由 U+0080 起。

下表总结了编码规则,字母 x 表示可用编码的位。

Unicode 范围<br />(十六进制) UTF-8 编码<br />(二进制)
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

注释:十六进制 007F 转换十进制为 127,二进制为 01111111。

以汉字“严”为例,演示如何实现 UTF-8 编码。
"严"的 Unicode 是 U+4E25(二进制数 100111000100101),据表,U+4E25 处在第三行的范围内(U+0800 ~ U+FFFF),因此“严”的UTF-8 编码需要三个字节,即格式 1110xxxx 10xxxxxx 10xxxxxx。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的 x,多出的位补 0。这样就得到 UTF-8 编码(二进制)是 11100100 10111000 10100101,转换成十六进制就是 E4B8A5

下图也总结了上述的编码规则。

UTF-8_Encoding_Scheme.png

4 参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容