字符集、编码字符集、字符编码集、unicode、utf8、utf16

转载需注明原地址,谢谢

目标:彻底弄懂字符集、编码字符集、字符编码集、unicode、utf8、utf16

1.什么叫字符集。

答:比如中文就可以叫汉子字符集,英文也可以叫英文字符集,总之就是指的一套字符的集合。

2.什么叫编码字符集

答:比如 我们规定 0 代表 我,1代表你,等等。 我们对字符集进行编码,一个字符对应一个整数序号(code point),这样集合就叫编码字符集。

其中较为出名的有:unicode、ascii。

3.什么叫字符编码集

首先讲讲为什么字符编码集的来历。
有了编码字符集后,下一步就是把字符的 code point 映射到计算机中。
常见的如ascii编码集,字符编码集中的数字与编码字符集中的数字字符一一对应。
然而ascii只有127个code point,当然可以完美表示。
而unicode有理论上有U+10FFFFcode point,
如果采取一一对应的方式,那么ascii表示需要1个字节的字符到unicode上需要3个字节。
而实际开发中,ascii的使用频率远远高于其他unicode字符,为了兼容其他字符,就让内存扩大3倍,所以这种一一对应的方式是不可取的。

那么如何选择一个合适的编码方案呢?

  • 1.首先字符编码集应该是变长的,且越是高频的字符越是含的字节少,这样可以最大程度上优化使用内存。
  • 2.其次,最好能够兼容一部分字符集。

综上考虑:

诞生了UTF系列和UCS系列编码
其中UTF分为UTF-8,UTF-16,UTF-32分别代表着用8位,16位,32位来代表某个单个code point。
其中UTF8和UTF16最为常用。

4.unicode

1.万国码。与ascii兼容

2.分成17区域,每个区域我们称为一个平面,其中每一个平面包含65536(0xFFFF)个code point,第一个平面 0U+FFFF,第二个平面U+10000U+1FFFF,以此类推。前两位是编号,范围在0x0~0x10之间,后4位为代码点。

3.最常见的是第一个平面,这个平面被称为 多语言平面(BMP)

4.unicode分成utf和ucs系列编码。

5.如何判断大小端?

  • 什么叫大小端? 大端含义,从左往右读(常见),小端,从右往左读。http://www.ruanyifeng.com/blog/2016/11/byte-order.html

  • unicode规定:

  • 那么很自然的,就会出现一个问题:计算机怎么知道某一个文件到底采用哪一种方式编码?

  • Unicode 规范定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做"零宽度非换行空格"(zero width no-break space),用FEFF表示。这正好是两个字节,而且FF比FE大1。

  • 如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。

  • 注意:这个规定是针对文件而言。实时上对于字节流而言,这没什么意义。

5.utf-8

1.变长,兼容ascii

image.png

首位0:表示1字节
首位110:表示2字节
首位1110:表示3字节
首位11110:表示4字节
….

10表示当前字节不是首位,为中间字节。
这里有个细节,为什么要中间字节为10而不是0呢?
如果用0表示,相同的字节可以表示更多的位。
但是作者为了兼容ascii,所以牺牲了一部分位。不然中文就可以2个字节表示也说不定。

指的注意的是:这种变长字符的方式还有其他的方式,例如mqtt 的消息里面的剩余字符字段就是变长的方式。

每个字节只用前7位,0表示结束,1表示还有剩余。

两种编码对比:

同样都支持ascii。

utf8的变长方式:可以知道提前知道有几个字节,起到一个校验的作用,但是会导致浪费一部分字节。

mqtt remaining字段的变长方式:无法知道有多少字节,但是会节省一部分字节。

6.utf-16

对于unicode BMP的65536个字符,采取一一映射到16位数值的方式。即采用2个字节,一个代码单元。

对于超过16位的数值,采用4个字节,即两个代码单元组成,这两个代码单元称为一个代理项对(surrogate pair)

注意U+D800和U+DFFF中间是unicode是没有定义字符,这是专门为UTF-16考虑的。

我们知道非BMP字符范围在U+10000~U+10FFFF,总共包含0xFFFFF个code point,即20位。

  • 我们将前10位作为代理项的高位代理,我们将前10位+0XD800可以得到范围是 0XD800~0XDBFF

  • 我们将后10位作为代理项的低位代理,我们将后10位+0XDC00可以得到范围是 0XDC00~0XDFFF

可通过代码看出:

这样的好处在于,可以分清楚一个代码单元(16位),属于BMP还是高代理项还是低代理项。三者的数字范围互不重叠。

UTF16和UTF8都有”自我同步”的特点,即通过一个代码点,就能推导出完整的代码序列,可以知道哪个字节开始,那个字节结束。

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

推荐阅读更多精彩内容