中文乱码问题困扰了我很久,这次尝试使用PyQt最费我时间的便是汉字的转码问题,所以想写一些关于这方面问题的总结,至少以后在遇到这类问题能少走一些弯路,也希望能够帮助和我一样的萌新们,如有纰漏,欢迎大佬指点!!!
首先,decode和encode的作用:
decode是将其他编码的字符串转换成unicode编码,如str.decode('utf-8'),表示将gb2312编码的字符串str1转换成utf-8编码。
encode是将unicode编码转换成其他编码的字符串,如str.encode('utf-8'),表示将unicode编码的字符串str2转换成utf-8编码。
如果网页是以‘utf-8’编码的,如
则抓取的网页的数据也都是utf-8编码,如果要写入到以gbk编码的文件,这时候要进行转换,一般是先要把’utf-8’decode成unicode码,然后再encode(‘gbk’)。unicode就像是不同编码转换的中间人
而我使用PyQt时遇到的主要问题是,从lineEdit和textEdit上获取的文本,我以为是str类型的,然而运行报错
Qstring 没有strip这个属性,what?QString和str不一样么......然后寻思能不能把QString转换成unicode然后转到str,发现
然后百度了一下方法,首先试了一下str(),发现并不可行,转换非中文还可以,而中文的话则会出现:
'ascii' codec can't encode characters in position 0-7: ordinal not in range(128)
这个错误比较常见,比如说以utf-8编码的str,str.encode('gbk')就会报类似的错误,有大佬详细分析,其等价为str.decode(encoding).encode('gbk'),而中间这步str.decode(encoding)会默认转换为ascii码。同理,str()也是如此,汉字经中间转换而来的ascii无法encode为汉字,即无法转换为你默认的编码
然后看到有人使用的是unicode函数,和我最开始思路一样,转换为unicode然后encode为我的默认编码,只不过我一开始的方法错了,改正后的代码为:
BattleTag_str=unicode(QtCore.QString(BattleTag)).encode('utf-8')
这里由于我最终的URL为
self.URL="http://hero./list/"+BattleTag_str
我默认的为‘utf-8’,所以把BattleTag_str也转换为utf-8编码
最后贴上两篇对我帮助非常大的博客,感谢这两位博主(虽然都是转载的,但找不到原创了)~~~
/uid-200142-id-4018863.html
/article/78679.htm