zoukankan      html  css  js  c++  java
  • python基础一 ------Python 的编码

    首先了解一下历史,但是本篇文章冗杂,如老太太裹脚布----------又臭又长

    编码历史:    

        1. 计算机只能处理数字,文本文件只有转换为数字
        才能处理。8bit==1字节 所以一个字节能表示的最大的数就是255
        
        2. 美国人发明计算机。用英语,所有一个字节就表示了所有字符
        就是ASCII(一个字节) 编码就是美国人的标准编码
        
        3. 当中国人使用计算机时,需要表示中文字符,于是就发明了
        GB2312的编码格式,即用两个字节表示一个汉字。同理,其他语言国家
        也就创建了自己相应的编码。没有一个共同的标准,于是当不同语言用
        了不对应的编码就会产生乱码

        4.为统一标准,Unicode 编码出现了,所有语言统一到一套编码
            Unicode与ASCII 编码比较
                1)  字母A: ASCII 十进制65,二进制就是 0100 0001
                    汉字中 ASCII表示不了 采用Unicode编码为20013 二进制:01001110 00101101
                2)  为计算机识别统一长度,所以A 前面位置补0 即 00000000 0100 0001
            标准就此统一
        5. 标准统一了,乱码问题解决了,但是Unicode编码长度较长,但计算机英文为主,
        若内容若全是英文,Unicode编码就比ASCII编码多一倍存储空间,同时传输也多一倍
        怎么解决呢?
        
        6.要是Unicode 编码可以变化就好了,于是UTF-8 出现了
        utf-8 中,字母一个字节,一个汉字3个字节,特别生僻的4-6个
        于是节约了空间和存储

        7,那么问题来了:计算机只认Unicode 编码
        utf-8 之间怎样转换的
        如图:





        当需要被计算机识别时,就会加载到内存,此时采用的编码就必须是Unicode 编码
        当需要在网络中传输时,或者存储在文件中时,就采用UTF-8编码,为了节约空间成本
        所以就有了相互转化

    python2 和python3 在Windows/Linux 上的编码转换    

    python2:        

      在Windows:            

        1. 先来看看window 本身是什么编码
                    import sys
                    sys.getdefaultencoding()
                    #out: "utf-8"
                2.    字符串全部英文
                    s1= "abc" -->  type(s1):str
                    s2 = u"abc" --> type(s2):Unicode
                        u""的意义:表示将后面的字符串以unicode格式存储
                    s1.encode("utf8")  成功
                    s2.encode("utf8")  成功

                3.  当出现中文时:
                    s1 = "你好"    --> GB2312编码。windows下
                    s2 = u"你好"
                    s1.encode("utf8")  报错
                    s2.encode("utf8")  成功
                    
                    报错原因:
                        在内存中是以Unicode 进行编码的,但是
                    s1 在传递过来时就是不是Unicode编码了(原因是存储浪费),而
                    encode是将一个Unicode 对象转化为参数中的编码格式进行编码
                    所以说 s2不会报错
                    
                    解决办法:
                        先将这个gb2312的编码转化为unicode编码的对象
                    然后再转化为utf-8
                        s1.decode("gb2312").ecode("utf8")  成功  Windows下为"gb2312"
                        decode("xx")方法是将一个编码为"xx"的对象转化
                    为Unicode对象        

      在Linux下:            

        1. 先来看看linux 本身是什么编码
                    import sys
                    sys.getdefaultencoding()
                    #out: "ascii"            
                2.    字符串全部英文
                    s1= "abc" -->  type(s1):str
                    s2 = u"abc" --> type(s2):Unicode
                        u""的意义:表示将后面的字符串以unicode格式存储
                    s1.encode("utf8")  成功
                    s2.encode("utf8")  成功
                3.  当出现中文时:
                    s1 = "你好"    --> utf-8编码。Linux下 为啥不是ascii? 那ascii能表示中文吗?
                肯定是转化为了utf-8 了啊
                    s2 = u"你好"
                    s1.encode("utf8")  报错
                    s2.encode("utf8")  成功
                解决办法:
                        先将这个utf-8的编码转化为unicode编码的对象
                    然后再转化为utf-8
                        s1.decode("utf8").ecode("utf8")  成功  Linux下中文为"utf-8"
                    等价于 s1 又转回去了,本身就是utf-8编码

    python 3:      

      在python3 中,所有的str类型的都是Unicode 格式编码,可以直接encode为"utf-8"
            
            在Windows:
                1.    字符串全部英文
                    s1= "abc" -->  type(s1):str
                    s2 = u"abc" --> type(s2):Unicode
                        u""的意义:表示将后面的字符串以unicode格式存储
                    s1.encode("utf8")  成功
                    s2.encode("utf8")  成功
                2.  当出现中文时:
                    s1 = "你好"    --> Unicode编码。windows下
                    s2 = u"你好"    ---> 没有必要这样写 ,不加u"",3也认为这就是Unicode
                    s1.encode("utf8")  成功
                    s2.encode("utf8")  成功  
            在Linux下: 跟在window 下一样      

     总结:    

    谈谈 #-*-coding:UTF-8 -*-                

      python2与3 最大的区别:
                    2 中当文件有中文出现时就必须在开头加上,而且汉字字符串必须加u""
                作用:
                      告知python 这个文件是按照utf-8格式编码的python就会按照这个编码进行解读,
                    然后在内部进行Unicode转换
                为什么3中不用写:
                      3中Python都会将文件以Unicode进行解读
    3



  • 相关阅读:
    DateTimePicker控件在WinXP下的BUG
    SmartAssembly .net混淆后,无法找到部分类型
    RPC_E_SERVERFAULT excel com操作错误
    System.Reflection.ReflectionTypeLoadException
    login SMTP send mail error : Unable to read data from the transport connection: net_io_connectionclosed
    静态类无法实现接口
    Combobox出现System.Data.DataRowView的原因
    .net 4.0 : Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.Binder.****'
    EOS 主节点同步
    使用tcpdump抓取EOS帐户创建与交易数据
  • 原文地址:https://www.cnblogs.com/ruoniao/p/6851875.html
Copyright © 2011-2022 走看看