• Python编码问题


    Python3中,所有的字符串在内存中均是unicode保存。

    t = 'abc'

    上述语句在计算机内存的执行顺序是这样的:

    • 在内存中创建一个字符串'abc'
    • 在程序栈寄存器创建一个变量t
    • 使得寄存器中的变量t指向'abc'(也就是把字符串'abc'的地址赋给t

    字符串变量在计算机内部的执行顺序

    虽然内存总是unicode保存,但是输出到文件中就是utf-8或者GBK等格式,根据文件的编码类型不同而不同。

    字符与unicode码的相互转化

    1. 字符转十进制unicode码
    >>> ord("中")
    20013
    
    1. 十进制unicode码转字符
    >>> chr(20013)
    '中'
    

    str类型字符串和bytes类型字符串的相互转换

    注意内容:

    • str类型的字符串在内存中是以unicode形式存在的
    • bytes类型的字符串可以是任意编码,表示形式是在字符串前面加b。例如b'ABC'即为bytes类型的字符串

    转换方法:

    str 转换为 bytes

    >>> '中国'.encode('utf-8')
    b'xe4xb8xadxe6x96x87'
    
    >>> '中文'.encode('GBK')
    b'xd6xd0xcexc4'
    
    >>> '中文'.encode('ascii')
    
    UnicodeEncodeError                        Traceback (most recent call last)
    <ipython-input-12-b318511b2a75> in <module>()
    1 '中文'.encode('ascii')
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
    

    第三条语句会报错,因为ascii编码无法解析中文

    bytes 转换为 str

    >>> b'xe4xb8xadxe6x96x87'.decode('utf-8')
    '中文'
    
    >>> b'xd6xd0xcexc4'.decode('GBK')
    '中文'
    
    demo_str = '宏杰'  # python3 默认的编码为unicode
    
    # unicode 转换为 gb2312
    unicode_gb2312 = demo_str.encode(’gb2312‘)  # 因为demo_str默认是unicode,所以不需要decode()成str。直接encode成要转换的编码gb2312。
    print('gb2312:', unicode_gb2312)
    b'xbaxeaxbdxdc'
    
    # gb2312 转换为 utf-8
    gb2312_utf8 = unicode_gb2312.decode('gb2312').encode('utf-8')  # 当前字符为gb2312所以要先decode成unicode(decode中传入的参数为当前字符的编码集)然后再encode成utf-8
    print('utf-8: ', gb2312_utf8)
    
    # utf8 转换为 gbk
    utf8_gbk = gbk2312_utf8.decode('utf-8').encode('gbk')  # 当前字符集编码为utf-8,要想转换成gbk,要先decode成unicode字符集,再encode成gbk字符集。
    print('gbk: ', utf8_gbk)
    
    # utf8 转换为 unicode
    utf8_unicode = utf8_gbk.decode('gbk')  # 注意当转换为unicode时,并不需要encode()了。
    print('unicode: ' utf8_unicode)
    
    # unicode 转换为 gb18030
    unicode_gb18030 = utf8_unicode.encode('gb18030')
    print('gb18030: ', unicode_gb18030)
    

    总结各个编码的相互转化都要先转换为unicode然后通过unicode再转换为想要的编码
    例如: utf-8、gb2312、gbk、gb18030 都是bytes字符集。中间桥梁为 unicode。

    字符串str 转换为 bytes 使用encode()转换为字节码
    bytes 转换为 字符串str 使用decode()转换为unicode编码

  • 相关阅读:
    USACO3.4.3Electric Fence
    (转)《算法艺术与信息学竞赛》题目 提交方式对照表
    UVA10382 Watering
    SGU104 Little shop of flowers
    UVA10673 Play with Floor and Ceil
    SGU123 The sum
    SGU106 The equation
    SGU105 Div 3
    UVA10905 Children's Game
    SGU101 200分类
  • 原文地址:https://www.cnblogs.com/a72hongjie/p/8978392.html
Copyright © 2020-2023  润新知