• 字符编码问题


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

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

  • 相关阅读:
    【DFS】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem D. Divisibility Game
    【二分】【三分】【计算几何】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem L. Lines and Polygon
    【线段树】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem J. Jedi Training
    【贪心】【后缀自动机】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem E. Enter the Word
    【转载】随机生成k个范围为1-n的随机数,其中有多少个不同的随机数?
    【推导】【贪心】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem H. Path or Coloring
    【枚举】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem D. Cutting Potatoes
    【找规律】【递归】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem F. Doubling
    【贪心】Codeforces Round #436 (Div. 2) D. Make a Permutation!
    【计算几何】【圆反演】计蒜客17314 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 G. Finding the Radius for an Inserted Circle
  • 原文地址:https://www.cnblogs.com/geogre123/p/10060605.html
Copyright © 2020-2023  润新知