关于字符编码

ASCII码表

作为一名程序员,对编码问题有必要了解一下。计算机是以二进制形式存储数据的,至于为什么选择二进制,这可能就需要从计算机的诞生历史说起了,这不是现在关注的点。

计算机文件一般可以分为(暂且这样分吧):文本文件和二进制文件。通俗的说,文本文件就是平常通过某个软件(记事本,EditPlus,UltraEdit,sublime等各种编辑器,各种IDE等等)打开看到是‘字符’,二进制文件就是打开是图片或视频等,当然是通过某些能够解释二进制的程序来完成。
这里需要强调的是,文件的后缀名不能用来区分文件的类型,后缀名只是系统(特别是Windows)用来对文件进行预先分类,并给予对应的图标和相应双击后打开的程序,至于预先给定的程序能不能打开就不得而知。
如,在Windows下,把一个txt文件的后缀名改成jpg后:



变成


双击打不开,用记事本依然能打开,就是内部编码没变,其实文件的类型在编码成二进制形式已经确定(一般是在头部)。

php读取图片文件:

$a = file_get_contents('bg.png');
echo $a;

浏览器以UTF8形式打开图片的二进制形式,虽然大部分是乱码,但头部还是可以看到解码为PNG的:

字符编码

字符编码就是每个在电脑里出现的字符都会对应一个二进制数,这个二进制可以成为码点(code point)。不同的编码形式,包含的字符数不同,字符和二进制数对应关系也不同。

ASCII码

ASCII(American Standard Code for Information Interchange)码是 比较早的编码形式,总共定义128个字符,用了一个字节的7位,也就是从 0000 00000111 1111

  • 0-32, 127:(共34个)不能直接显示字符的(控制或者通信使用的),32是空格也算在其中,127是删除符;
  • 33-64,91-96,123-126:(共21*2=42个)键盘上除了英文字母和不直接显示字符的键有21个,每一个键上有两个字符;
  • 65-90,97-122:(26*2=56个)英文字母;

对于英语系的人来说这128个字符已经够了,他们在电脑上接触的的字符也就这么多够了,说来也是奇特,英文字符26个就能通过组合用来表示英语所有意思,这种组合形式很适合计算机。而我们汉语就不同了,我想是不能通过笔画的组合组成所有汉字了。
据说汉语是最难学的语言之一😅,辛亏我已经会汉语了😀😝。

Unicode

128个字符对于其他语言是远远不够的,单汉字就有将近10万个(常用应该几千个),每个汉字都需要一个码点,其他语言中的字符也需要对其字符编码成码点,原本有很多编码方式,这些编码没有进行统一规定,就会有冲突,一个二进制数在不同编码方式中就有可能解释为不同的字符,这样使不同地区的人交流不便。

Unicode就是在这样条件下诞生,简单的说,Unicode就是大的映射表,把全世界所有语言符号都包含其中,每个符号的映射的码点的都不相同。 汉字大部分可以用4个16进制数表示,参看汉字Unicode。如:U+620E表示(这是我的姓,读róng,不是 ,在这里普及一下,我已经被叫成 戒某 无数次了🤦‍♀️🤦‍♀️🤦‍♀️)。

Unicode是一个庞大的字符集,一个很多字符与二进制数的唯一的一一对应集合。Unicode没有规定怎么存储,620E(0110 0010 0000 1110)至少需要2个字节,而其他字符可能需要更多字节。像U+0041表示英文字母A,如果也需要用2个字节或者更多,则前面的有一些字节都是0,那么太浪费资源了,为了减少空间的浪费就出现了UTF8。

UTF8

UTF8是Unicode存储一种实现方式。它采用变字节数(1-4个)来节约资源。 UTF-8的编码规则很简单,只有二条:

  1. 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的Unicode码。因此对于英语字母,此时UTF-8编码和ASCII码是相同的。
  2. 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的Unicode码。

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

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

这样解读UTF8编码就容易区分几个字节表示一个字符了。如果一个字节的第一位是0,那么这个字节单独表示一个字符;如果一个字节的第一位是1,那么这个字节下面连续几个1,就表示当前字符占用几个字节。

以汉字为例,看看UTF8编码实现过程: 已知的Unicode是620E(0110 0010 0000 1110)。

  1. 620E 在第三行范围内(0000 0800 - 0000 FFFF),因此需要三个字节编码,即 1110xxxx 10xxxxxx 10xxxxxx
  2. 的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。得的UTF8编码的十六进制是E6888E
image

参考:字符编码笔记:ASCII,Unicode和UTF-8

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

推荐阅读更多精彩内容

  • 字符是用户可以读写的最小单位。计算机所能支持的字符组成的集合,就叫做字符集。字符集通常以二维表的形式存在。二维表的...
    刘惜有阅读 8,065评论 2 14
  • 大学是很多人从小就向往的地方,因为总是听人说“中学好好读书,上了大学,想怎么玩就怎么玩”。只有上了大学的人才知道,...
    unique太阳先森阅读 286评论 0 2
  • 为搜索引擎设计一个 key-value 储存 原文链接 1.描述使用场景和约束 使用场景: 用户请求可以命中缓存或...
    MontyOak阅读 809评论 0 0
  • 你出生的地方,在郊外的地方有座山。在这样乡下的“无线”城市是最正常不过。刚好,它挡住了年幼的你的视线。你好奇它后面...
    余一芳阅读 380评论 1 0
  • 文章名:你的一只新铅笔盒,却毁了我的一生! 作者:雾满拦江 公众号:雾满拦江 文章结构: 老总被诬陷的故事→小朋友...
    一念_花开阅读 387评论 0 0