美文网首页Python学习之旅
Python2编码的问题

Python2编码的问题

作者: 依旧丶森 | 来源:发表于2018-01-20 18:01 被阅读3次

    1.怀念python3

    python3默认情况下,是通过unicode直接编码操作的,对于字符串、特殊字符、数字的支持都是一致的,字符串的编码和解码操作方式非常简洁。

       #字符串构造了一个str对象,默认情况下就是通过unicode直接编码的字符
       >>> s = "中文"
       #如果将字符转换成字节,进行编码操作:s.encode(“utf-8”)
       >>> x = s.encode("utf-8")
       >>> x
       b'\xe4\xb8\xad\xe6\x96\x87'
    
       如果将字节转换成字符,进行编码操作:s.decode(“utf-8”)
       >>> x
       b'\xe4\xb8\xad\xe6\x96\x87'
       >>> x.decode("utf-8")
       '中文'
    

    2. 吐槽python2

    python2中,默认情况下是通过ascii编码进行操作的。
    python2中的字符串有这样几种类型 [basestring | str | unicode]
    其中 str 和 unicode 是继承自 basestring 的。

    糟心的来了:python2中创建的字符串s=”abc”是str类型的,但在python2中是 str 是 bytes字节类型保存的.......有毒。

       默认情况下:
       >>> s = "中文"
       >>> s
       '\xd6\xd0\xce\xc4'
    
       所以在包含中文字符串保存时,需要在字符串的前添加一个u字符
       #表示是通过unicode编码的
       >>> s = u'中文'
       >>> s
       u'\u4e2d\u6587'
    
       如果是默认字节形式的中文字符串,要得到原本的中文形式
       #需要decode()函数操作
       >>> s = "中文"
       >>> s
       '\xd6\xd0\xce\xc4'
       >>> x = s.decode("gbk")
       >>> x
       u'\u4e2d\u6587'
    
    • 为什么python2中要将 unicode 编码的字符串转换成 ascii 编码进行后续的操作?

      因为python内置的大量模块,并没有提供中文支持,调用内置模块的函数操作时,如果出现了非 ascii 编码,就会出现 ascii编码不支持的错误
      UnicodeEncodeError: 'ascii' codec can't encode characters

          将unicode字符串,转换成bytes类型的str字符串
          >>> s
          u'\u4e2d\u6587'
          >>> xs.encode("gbk")
          >>> x = s.encode("gbk")
          >>> x
          '\xd6\xd0\xce\xc4'
      
      
    • python2编码解码的问题——字符串

      • 核心:字节和字符之间的转换
      • 字节:专门给程序使用【python2内建的模块,如~写入文件】
      • 字符:给用户看
        • 默认创建的字符串str类型的,bytes字节类型
        • 字节类型 str ->字符类型 unicode:s.decode(“utf-8”)
        • 字符类型 unicode ->字节类型 str: s.encode(“utf-8”)
            # 默认encode(“ascii”)

        警告:python2中的str类型,默认就有一个encode()函数,但是这个函数只是在定义时为了对象操作的完整性出现的,使用会直接报错。
        python2中的unicode类型,默认有一个decode()函数,同样不要去使用!

    相关文章

      网友评论

        本文标题:Python2编码的问题

        本文链接:https://www.haomeiwen.com/subject/davtaxtx.html