一旦走上了编程之路,如果你不把编码问题搞清楚,那么他将像幽灵一样纠缠你的整个职业生涯,各种灵异事件接踵而至,挥之不去。只有充分发挥程序员死磕到底的精神,你猜有可能彻底摆脱编码问题带来的烦恼。
ASCII 占1个字节,只支持英文GB2312 占2个字节,支持6700+中文GBK GB2312的升级版,支持21000+汉字shift-JIS 日本字符ks_c_5601-1987 韩国编码TIS-620 泰国编码
由于每个国家都有自己的字符,所以其对应关系也涵盖了自己国家的字符,但是以上编码都存在局限性,应运而生,出现了万国码,它涵盖了全球所有的文字和二进制的对应关系。
unicode 2-4字节,已经收录136690个字符,并还在一致不断扩张中...
unicode解决了字符和二进制的对应关系,但是使用unicode表示一个字符,太浪费空间,例如:利用unicode表示"Python"需要12个字节,比原来的ASCII增加了一倍!
为了解决存储和网络传输的问题,出现了Unicode Transformation Format ,学术名:UTF。
UTF-8 :使用1,2,3,4个字节表示所有字符,优先使用1个字符,无法满足则增加一个字节,最多4个 【英文占1个,欧洲语系占2个,东亚占3个,其他及特殊字符占4个】UTF-16 :使用2,4个字节表示所有字符,优先使用2个字节,否则使用4个。UTF-32 :使用4个字节表示所有字符。
总结:UTF是为unicode编码涉及的一种在存储和传输时节省空间的编码方案。
字符在硬盘上的存储:
无论以什么编码在内存里显示字符,存到硬盘上都是二进制。要注意的是,存到硬盘上时是以何种编码存的,再从硬盘上读取出来时,就必须以何种编码读。
虽然国际语言是英语,但是大家在自己的国家依然说自己的语言,不过出了国,你就得学会英语,编码也一样,虽然有了UTF-8,但是由于历史原因,各个国家依然在大量使用自己的编码, 比如中国的Windows,默认编码依然是GBK,而不是UTF-8
编码转换过程:
实际代码演练中,在py3上,把你的代码以utf-8编写,保存,然后再Windows上执行。
so一切都很美好,到这里,我们关于编码的学习按说就可以结束了。
但是,如生活一样,美好的表面下,总是隐藏着不进入人意,上面的UTF-8编码之所以能在Windows GBK的终端下显示正常,是因为到了内存里python解释器吧utf-8转成了unicode,单这只是Python3,并不是所有的编程语言在内存里默认编码都是unicode,比如万恶的Python2就不是,他的默认编码是ASCII,想写中文就必须声明文件头的coding为gbk或者UTF-8,声明之后,python2解释器仅以文件头生命的编码去解释你的代码,加载到内存后,并不会主动帮你转成Unicode,也就是说你的文件编码是UTF-8加载到内存里,你的变量字符串就也是UTF-8,这意味着什么你知道吗?
意味着你以UTF-8编码的文件,在Windows是乱码。
乱是正常的,不乱才不正常,因为只有两种情况,你的Windows上显示才不会乱。
1.字符串以GBK格式显示
2.字符串是unicode编码
既然Python2并不会自动的把文件编码转换为unicode存在内存里,那就只能使出最后一招了,你自己人肉转。Py3自动把文件编码转为unicode必定是调用了什么方法,这个方法就是,decode(解码)
和encode(编码)。
UTF-8 ---> decode解码 ---> UnicodeUnicode ---> encode编码--->GBK/UTF-8
decode实例:
encode实例:
记住下图规则:
一般UTF-8一个中文占三个字节,GBK一个占2个字节。
Python bytes类型
在python2上写字符串。
虽说打印的是路飞,但是直接调用变量s.看到的却是一个个的16进制表示的二进制字节,我们怎么称呼这样的数据呢?直接叫二进制么?也可以,但相比于010101,这个数据穿在表示形式上又把2进制转成了16进制来表示,这是为什么呢?哈,为的就是让人们看起来更可读,我们称之为bytes类型,即字节类型,他把8个二进制一组称为一个byte,用16进制来表示。
想告诉你一个事实,Python2里面bytes == str,其实这是一回事,除此之外,python2里面还有个单独的类型是unicode,把字符串解码后,就会变成unicode。
python的发展越来越快,已经不能再修修补补。Python3横空出世,
python3除了把字符串的编码改成了unicode,还把str和bytes做了明确的区分,str就是unicode格式的字符,bytes就是单纯的二进制了。
python只要出现了各种编码问题,无非是哪里的编码设置错了。
常见编码错误的原因:
1.Python解释器的默认编码
2.Python源文件编码
3.Terminal使用的编码
4.操作系统的语言设置,掌握了编码之前的关系后,挨个排错就好了。