开发者社区> 问答> 正文

python编码中文乱码怎么回事

python编码中文乱码怎么回事 问题来源于python学习网

展开
收起
游客ejnn55cgkof5g 2019-12-11 17:59:04 752 0
1 条回答
写回答
取消 提交回答
  • 首先明确几个概念:

    字节流:以utf8/gbk等编码编码的字节流。

    unicode对象:python代码中,a=u'中国', 或者a='中国'.decode()的结果。

    terminal用于显示字符的编码:将一个用utf8/gbk编码的字节流通过terminal指定的编码,去查找对应的字符显示出来。

    locale:linux下,Locale 是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory) 和字符集(Codeset)。一个locale的书写格式为: 语言[_地域[.字符集]]. 所以说呢,locale总是和一定的字符集相联系的。比如:zh_CN.GB2312

    编码转换原则:unicode是"中介",任何编码之间转换都需要先decode()到unicode。

    学习python,尽在python学习网!

    针对python,先把结论放在前面,三点:

    #coding:utf-8 #.py文件是什么编码就需要告诉python用什么编码去读取这个.py文件。

    sys.stdout.encoding,默认就是locale的编码,print会用sys.stdout.encoding去encode()成字节流,交给terminal显示。所以locale需要与terminal一致,才能正确print打印出中文。

    sys.setdefaultencoding(‘utf8’),用于指定str.encode() str.decode()的默认编码,默认是ascii。

    对编码字符串a,代码中可以直接写a.encode(“gbk”),但事实上内部自动先通过defaultencoding 去decode成unicode之后再encode()的。

    str(xxx)应该也是用这个去编码的。

    'ascii' codec can't encode characters in position 7-8: ordinal not in range(128)print的时候出现这个错误一般可以使用这个方案去处理。

    为了避免代码中到处都要去encode(“xxx”),还有可能不同的地方写得不一样带来不一致的情况,推荐使用这个:

    import sys

    reload(sys)

    sys.setdefaultencoding('utf8')

    专题推荐:编码 问题来源于python学习网

    2019-12-11 22:04:07
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载