utf-8到底是怎么回事?

熟悉计算机的同学一定听说过编码字符集这么个名词。utf-8作为当下被广泛应用的编码字符集,大家也一定有所耳闻。

对于电子计算机而言,处理器只能识别二进制机器码。所以任何人类可以进行阅读的电脑文件,其实只是一系列0和1的组合。是字符编码规则,将机器可以识别的二进制内容转换为人类可以识别的各种文档。

最早的编码字符集ACSII,使用1字节表示128个字符,一个字节是8位,也就是从0~127(二进制区间为00000000~01111111),每一个数值都对应着一个字符。但是ASCII是为英语设计的,不能表示诸如汉语等其他语言的字符。

针对这个问题,大家可能会觉得,我们只要使用更多的字节,就可以有更大的整数范围去和世界上所有的字符一一对应。这当然是一种解决问题的办法,然而单纯的扩大字节数是有弊端的。假设我们可以使用4个字节表示所有字符,文件中每个字符都使用4个字节进行表示,结果原本ASCII中仅需要一个字节就能表示的字符也占用了4个字节的空间,这就造成了极大的浪费,要知道早期计算机的存储设备不仅价格高昂而且容量小。于是变长编码字符集应运而生,我们今天常见的utf-8就是变长编码字符集的一种。

utf-8字符集与ACSII字符集是兼容的,也就是说可以被ASCII正常解读的文件,可以被utf-8正常解读,而且结果一致。那么utf-8究竟是怎么进行编码的呢?

我们发现ACSII虽然使用了一个字节来表示字符,但是最高位是没有使用的。utf-8也使用每个字节的头几位来记录关于字符编码的信息。

例如对于汉字而言,utf-8需要3个字节来进行表示,一般长这个样子:1110xxxx 10xxxxxx 10xxxxxx。对于第一个字节,使用二进制111表示这个字符需要3个字节,再加上一个0与实际要记录的值隔开,最后4位是该字符实际二进制值的最高4位。对于第二第三个字节,最高两位使用10占位,剩下的6位分别是该字符实际二进制值的中间6位和最后6位。

与上面的表达方式类似的,2个字节表示的字符,在二进制下表示为:110xxxxx 10xxxxxx;4个字节表示的字符,在二进制下表示为:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx;5个字节表示的字符,在二进制下表示为:111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx;6个字节表示的字符,在二进制下表示为:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx。

实际上对于我们平时使用而言,4个字节已经足够了(即除ACSII字符外,还可以表示2^21-1个字符,约200万个字符)。而且使用超过4个字节表示字符也是不合utf-8规范的。

当计算机根据utf-8编码解码文件时,如果遇到一个字节是以10开头的,那么立刻可以知道这不是一个字符的开头。通过向前或向后查找以110、1110、11110开头的字节开始进行解码。而当遇到以0开头的字节时,自然按照ACSII码来进行处理。

下面我使用go语言编写一段代码,示例utf-8的编码方式:

```go

s :=`中a`

fmt.Println("字节长度",len(s))

for i :=0;i

fmt.Printf("十进制字节值: %d,二进制字节值: %08b\n",s[i],s[i])

}

fmt.Println("=======")

for i,r :=range s {

fmt.Printf("字符在串中的位置: %d,字符: %c,二进制码: %08b\n",i,r,r)

}

```

输出结果为:

字节长度 4

十进制字节值: 228,二进制字节值: 11100100

十进制字节值: 184,二进制字节值: 10111000

十进制字节值: 173,二进制字节值: 10101101

十进制字节值: 97,二进制字节值: 01100001

=======

字符在串中的位置: 0,字符: 中,二进制码: 100111000101101

字符在串中的位置: 3,字符: a,二进制码: 01100001

结果印证了上文中的描述。

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