一个逗逼程序员解说 字符编码 问题

你的编程道路上一定遇到过这些东西:"�怨�蝚�" , "别踩白孥 "??’וˆ°ו÷•ט¾¹„ח?";
大写的 waht ???
什么东东啊?第一次遇到这玩意,我(西岭老湿)基本就是这样的:


12x.png

22x.png

哈哈,没错,在我们天朝的编程江湖中,这就是大名鼎鼎的:乱码 ;
如果你稍微有点经验,这些东西也不难解决,相信你也一定能解决,无非就是统一编码或者叫统一字符集而已;

数据库使用UTF8,我们把代码文件改成UTF8,代码的头声明里也用UTF8,浏览器也改成UTF8。这些地方都统一使用一种编码后,基本99.99% 的乱码问题都会被我们解决;
但是,你有木有想过,为什么统一编码就能解决问题了,编码或者字符集是个神马东西吆,为何如此神奇啊?

好了,带着刨根问底的优秀品质(分明就是钻牛角尖)我们来 和 编码字符集做一个赤身裸体的面谈;
首先这要追溯到互联网遥远的上古时代(接着吹,计算机发明还没有100年呢),话说计算机一出生,人家就只认识0、1,当然现在也没什么进步(堕落的家伙),而0、1这样的东西,被我们人类定义为二进制,0代表没有,1代表有;
但是计算机他妈(我是文明人你们不要断错句)稍微有点文化,于是教育计算机说:我给你8个01这样的东西,他们的位置可以随意变化,而一种变化就代表一种含义,类似于:01100001 代表八进制141、十进制97、十六进制61、小写字母a;01010010 代表八进制122、十进制82、十六进制52、大写字母R;在记忆的时候,8个01占用1个字节的脑容量,1个字节就占用8个位的脑容量,这家伙记忆力相当不错啊;

他妈就把这8个01所有变化的可能性都拿出来,做了一张表,但是做完这张表发现,最多只有256种结果,于是就把他妈使用的语言字母(英文字母)全部对应到这张表里,还顺便把一些标点符号也做了对应,更顺便的给这个表起了名字叫:ASCII ;见下图↓

ascii_Table2.png
ascii127-255.jpg

于是,计算机这个小娃娃按照他妈给他的这套规则,顺利的和老妈进行对话交流,无比欢乐;但是,由于计算机这个小娃娃活蹦乱跳还能干活,而且时不时还能耍贱卖萌,甚是可爱,绝对是居家旅行的必备良品,很多人都想和他交流探讨出去浪,成为好基友;可是他妈只给了他一套规则,别的他肯定是不懂啊,这个时候,很多的怪蜀黍就出现了,给这个小娃娃按照自己的规则制定了一套类似的表格,也给这些规则表起了各种名字;
于是这种表格,我们就习惯性的统称为 字符编码,而表格里的内容(就是对应的规则) 我们统称为 字符集;
但是,这些怪蜀黍在制定规则的时候遇到了问题,比如我们天朝这位比较深邃苍老的蜀黍发现,中华文化的博大精深还真不是这个小孩子用8个01就能掌握的,国家在1988年公布的《现代汉语常用字表》选收了2500个常用字、1000个次常用字,总共只有3500字;而算上罕用字,古汉语字,日韩等国的汉字衍生字则有近10万个汉字;
这时聪明的天朝专家们在ASCII的基础上,把原来ASCII码表里 127 以上的搞不懂的火星文去掉,规定:一个小于127的字符的意义与原来(就是ASCII)相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们组合出大约7000多个简体汉字,每个汉字占用2个字节的脑容量,而这就是GB2312字符编码;
有了这套编码,我们天朝(还有新加坡)就和这个小娃娃没羞没臊的过上了幸福的小日子,但是,柴米油盐酱醋茶,时间一长就发现,7000个汉字根本不够用啊,于是我们的专家们又搞了一套叫GBK的编码,当然了肯定是兼容GB2312的;
就这样,各位怪蜀黍都给了计算机自己定制的编码规则,也都生活在自己的桃花源(单机时代);但是天要下雨娘要嫁人,这小孩逐渐长大,他就想和其他小孩一起浪(开门接客,互联网时代到来),然后就发现,完蛋玩意,你说啥他说啥,谁也听不懂谁;你跟我说了一段德语编码后的二进制01,结果我在解读的时候用GB2312的汉语编码规则解读,那肯定就乱码了呀,所以就↓


322.png

那么此时,肯定有小伙伴们问了:西岭老湿,那后来怎么样了?如何解决的啊?

好了,好了,都别急啊,都已经凌晨了,让老夫先睡会啊(世界都无法沟通了,还有心情碎觉,滚起继续……);

睡醒继续卖萌……

为了解决各种语言使用不同的编码规则,西岭老湿带领各国领导和语言学家及计算机大拿们(当然,我在吹牛),制定了万国码,就是我们俗称的 Unicode 编码,这套规则就厉害了,能把世界上所有的语言全部找到对应的规则,这么腻害的东西是怎么搞的?嘿嘿,偷偷告诉你,其实Unicode是使用4个字节来表示一个字的,也就是说,这套规则理论上可以容纳 2 的 32-1次方 个字(数学公式不会写,就文字表达吧),那是多少呢?一五得五,二五一十,三五二十五,五五二十八,嗯嗯,算出来了,大概是21亿左右的样子,以人类现在语言和文字的增长速度,再用几万年应该是没有问题哒(心中长舒一口酒气,那就好,那就好);


么么哒.png

BUT !!!
对于英文(严格来说,英文字母应该叫拉丁字母,严肃脸)来说,伦家本来一个字节就可以横行天下了,你非得给我4个字节,太浪费了,伦家不要啊……
还有就是,计算机怎么知道,四个字节表示一个Unicode中的字符,还是分别表示四个ASCII的字符呢?又TM乱了……

就是这两个问题,一困扰着Unicode,也使其在推广上遇到了各种难题,直到 Ben Thomson 大神在吃饭时灵机一动,在一张餐巾纸上,设计出了第一个版本的UTF8(这个是真的,爱信不信);其实UTF8是Unicode的一种实现方式,而Unicode是一个统一标准规范,Unicode的实现方式除了UTF8还有其它的,比如UTF16、UTF32等。

西岭老湿的好基友阮一峰老师说,UTF-8的基本规则,其实可以简单概括成两条:

  • 规则1:对于单字节字符,字节的第一位为0,后7位为这个符号的Unicode码,所以对于拉丁字母,UTF-8与ASCII码是一致的。
  • 规则2:对于n字节(n>1)的字符,第一个字节前n位都设为1,第n+1位为0,后面字节的前两位一律设为10,剩下没有提及的位,全部为这个符号的Unicode编码。

通过以上简单规则,UTF8采取变字节的方式,解决了我们前文提到的关于Unicode的两大问题。同时,作为中文使用者需要注意的一点是Unicode(UTF8)与GBK、GB2312这些汉字编码规则是完全不兼容的,也就是说这两者之间不能通过任何算法来进行转换,如需转换,一般通过GBK查表的方式来进行。

好了,我要出去浪了,谈话就到这吧,相信你也懂了字符编码,如果还是不懂,那么我建议你
再看一遍,顺便关注我一下……
如果你懂了,但是并没有关注我,那么:


嫖娼.png

怕了吧?嘿嘿,来吧……

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

推荐阅读更多精彩内容