字符编码问题

一旦走上了编程之路,如果你不把编码问题搞清楚,那么他将像幽灵一样纠缠你的整个职业生涯,各种灵异事件接踵而至,挥之不去。只有充分发挥程序员死磕到底的精神,你猜有可能彻底摆脱编码问题带来的烦恼。

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解码 ---> Unicode
Unicode --->  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.操作系统的语言设置,掌握了编码之前的关系后,挨个排错就好了。

posted @ 2018-12-03 20:15  G先生  阅读(373)  评论(0编辑  收藏  举报

:guocheng