“我明明是对的,可是在你眼中,我却是错的。”
今天的主题不是男女心灵鸡汤,而是“乱码”。
“乱码”这个词我们平时经常听到,偶尔也会遇到,就是类似“倰CScs4?⒉?&5乱D揟”这种不明所以的文字,但这玩意儿是咋产生的哩?
我们知道,无论多么复杂的文字,图像,视频存储到计算机里面都只是一堆二进制的数字,我们需要指挥计算机把这些人类难以理解的二进制数据转换成人可以理解的绘制表示(我们平时看到的字符也是一种的绘制 )。
计算机和人之间因为语言不通无法直接沟通,这和不同语种的人类一样,没有办法直接对话的。所以当语言不同的两个人需要交流时就需要一本翻译用的词典了(当然词典也可能是翻译官什么的)。
计算机也一样,当它想把二进制的数据表示成人能够看懂的语言时也需要一本词典,这本词典就是 字库表 。人类世界中的语言五花八门,什么英语,汉语,日语,法语啥的,对应的词典自然也是各有不同,但是对计算机来说,这个世界只有两种语言,二进制语言和其它语言,所以词典只需要一本,囊括所有的其它语言就好了,虽然听起来像是一本很大的词典,但是相对计算机的存储来说只是九牛一毛罢了。
人类的各种字符对计算机来说就是画各种形状,不同的二进制数据就对应不同的字符的形状,为了让二进制数据和字符关联起来,就需要一个对应表,这个对应表就是词典的索引,当计算机想把一个二进制数据转成字符时,它会照着索引翻到词典中指定的位置,看看那一个位置是个啥形状,然后把它画到屏幕上,这个索引表我们叫做 编码字符集 ,为了让这个索引大到足够容纳人类认知的所有字符,于是出现了我们耳熟能详的Unicode编码字符集(但这个规范的设计者当初小觑了人类字符的数量,把编码范围搞得太小——只有16位,而遭遇尴尬)。
Unicode后来被扩展到32位表示,编码空间是足够大了,但是存一个字符的代价也变大了。其实大家平时常用的字符范围很小,用这么大的空间来存储字符实在是太浪费了,所以实际对字符进行编码的时候做了一些优化,按照需要压缩了Unicode索引的范围。这些对字符集进行实际编码的实现叫 字符集编码 ,当然又是我们耳熟能详的几个词:ASCII,UTF-8,GBK...,它们都是对字符集的编码实现。如果Unicode是人类语言的大辞典,那各种字符集编码就是为了适应实际使用环境而编写出来的小词典。
现在再来想想乱码是怎么出现的?简单说就是查找字符对应关系错了,我明明用的是法语词典的1,3,7,10页指定的单词组成了一句话,却偏偏告诉你在汉语词典的对应的位置找单词组成一句话,你得到的自然就是一句不明所以的话。虽然道理浅显易懂,但是在实际使用过程中,由于字符集编码很多,平台不同,默认保存方式不同,稍不注意就掉进乱码坑里了。
“我特么错哪了!”
本文来自给产品经理讲技术(微信公众号:pm_teacher)授权发表,转载请联系原作者,违者必究。
- 还没有人评论,欢迎说说您的想法!