pythonencode是生成字节码吗_python字符encode之后内存状态如何变化?

用python的话……推荐做法是“不要问这种问题,照说明选择正确的编码写出正确的程序就行了”。

python2默认以ascii格式保存字符串,而python3默认以utf-8格式保存。

换句话说,如果是python2且没有其它声明时,str1是ascii格式,str2是utf-8格式;如果是python3,str1和str2都是utf-8格式(但在windows下,中文默认为GBK格式)。

如果你在python3里面做个实验,还是你那段代码,只是检查对象换成str1:>>> print(chardet.detect(str1))

Traceback (most recent call last):

File "", line 1, in

File "/usr/lib/python3/dist-packages/chardet/__init__.py", line 25, in detect

raise ValueError('Expected a bytes object, not a unicode object')

ValueError: Expected a bytes object, not a unicode object

也就是说,str1是字符串,所以被chardet拒绝;而encode为utf-8后的str2并不是字符串,它是一个“bytes”,格式为ascii。

这透露一点,那就是python语言里,我们统称的“字符串”其实有两种类型,一是unicode,二是bytes——前者是真正的字符串,后者是“字节序列”。

默认字符串为unicode类型;一个unicode类型的对象经过encode之后,就得到了一个“字节序列”(print输出时,会以b""格式提示这一点)

你看,连对象类型都变了,你再去谈论str1和str2的“内存状态”,还有意义吗?

真正想要比较,你应该把str1这个unicode分别编码成UTF8、GBK、ASCII等格式的bytes(注意对象类型变化),再逐个byte的输出每个bytes的内容,这个比较才有意义。

当然,其实这个比较并无必要,直接读相关编码规范就行了——编码规范才会告诉你,为何明明把str1给encode成utf8了,怎么chardet detect的结果却是ascii呢?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值