python3 字符编码问题原理简介

Python 编码问题

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

t = 'abc'

上述语句在计算机内部的执行顺序是这样的
- 在内存中创建一个字符串 'abc'
- 在程序栈寄存器中创建一个变量t
- 使得寄存器中的变量t指向'abc' (也就是把字符串'abc'的地址赋给t)

字符串赋值语句图示

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

字符与unicode码的相互转换

  1. 字符转十进制unicode码

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

    >>> chr(20013)
    '中'
    

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

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

转换方法:

  1. strbytes

    >>> '中文'.encode('utf-8')
    b'\xe4\xb8\xad\xe6\x96\x87'
    
    >>> '中文'.encode('GBK')
    b'\xd6\xd0\xce\xc4'
    
    >>> '中文'.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编码无法解析中文

  1. bytesstr

    >>>b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
    '中文'
    
    >>>b'\xd6\xd0\xce\xc4'.decode('GBK')
    '中文'
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值