用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呢?