python3编码问题

字符串以两种形式存在:

一种是给人看的形式,一种是给电脑处理用的形式:

  • 给人看的字符要转变为储存传输的字节,用encode函数.

    使用encode时,需要指定编码方式,python3默认是utf-8.(而python2是ascii).

  • 从字节转变为为字符用,decode函数.

    使用decode时,需要已知字节的编码方式,python3默认的是utf-8.

Python3:

In [1]: hex(ord('中'))
Out[1]: '0x4e2d'

In [2]: '\u4e2d'
Out[2]: '中'

In [3]: '中'.encode('utf-8')
Out[3]: b'\xe4\xb8\xad'

In [4]: '中'.encode('unicode-escape')
Out[4]: b'\\u4e2d'

n [5]: b'\u4e2d'.decode('unicode-escape')
Out[5]: '中'

In [6]: b'\xe4\xb8\xad'.decode('utf-8')
Out[6]: '中

b'\xe4\xb8\xad' ,b'\\u4e2d'

为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。

UTF-8的编码规则很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

In [1]: bin(0xe4b8ad)
Out[1]: ‘0b1110**0100**10**111000**10**101101**’

In [2]: bin(0x4e2d)
Out[2]: '0b100111000101101

1110xxxx 10xxxxxx 10xxxxxx

unicode 和 utf-8的区别:

unicode是全体字符和数字的一个映射关系,比如’A’是65,’中’是20013.
每个字符用的字节数以那个用了最大字节数的字符来确定,其他补充为0.
如果以这个映射关系进行储存传输,无疑会很浪费资源.

utf-8可以用不同个数的字节来表示字符.但是我们必须告诉计算机这个字符用了几个字节,以此来帮助计算机判断.

参考:
http://blog.csdn.net/lxdcyh/article/details/4018054
http://blog.sina.com.cn/s/blog_6d7cf9e50102vo90.html
http://blog.chinaunix.net/uid-21633169-id-4337685.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值