zoukankan      html  css  js  c++  java
  • Python3 错误UnicodeEncodeError: 'ascii' codec can't encode characters in ordinal

    问题

    之前在使用Python2的时候,经常会遇到编码相关的错误,异常头疼。主要是因为Python2字符串设计上有一些固有的缺陷:

    使用 ASCII 码作为默认编码方式,对中文处理很不友好。
    把字符串的牵强地分为 unicode 和 str 两种类型,误导开发者

    与Python2不同,Python3默认使用utf-8编码方式,并且Python3的字符主要由两种:str/byte。因此正常情况下,Python3很少出现编码问题,但是最近在使用docker的时候,又发生了两次编码错误问题,分别是因为:

    1.docker环境(或当前命令行环境的默认编码不是utf-8)
    2.处理的文件默认编码不是utf-8,而是ascii

    解决方法
    问题1

    针对这两个可能的原因,首先判断系统的(或者当前命令行环境的)编码:

    #首先进入python环境
    import sys
    sys.stdout.encoding
    >>> 'US-ASCII'

    这种情况下表示,当前的命令行的编码是ascii,所以需要手动改成utf-8:

    export LANG="en_US.UTF-8"

    如果是在ubuntu环境下,可以将上面这行命令加入~/.bashrc中一劳永逸解决问题,加入后运行下面命令使其生效或者重启生效。

    source ~/.bashrc

    或者另一种方法是,只针对python设定相应编码(同上,命令行运行或者加入bashrc文件):

    PYTHONIOENCODING='utf_8'
    export PYTHONIOENCODING

    问题2

    如果上面系统输出的已经是UTF-8,另一个可能的原因是读写的文件默认编码是ASCII。比如在使用json.dump()命令时,如果使用了其中的ensure_ascii=False关键字,而此时如果写入尝试写入非ascii的字符时就会报上面的错误,解决办法是提前指定操作文件的编码方法:

    import json
    import codecs # 比较方便处理各种非ascii编码的库
    with codecs.open('your_file.txt',mode='w',encoding='utf-8') as fp:
    json.dump(
    json_str,
    fp,
    skipkeys=False,
    indent=4, # 不使用该关键字时,所有字符写在同一行,省空间,但是文件较大时打开慢
    ensure_ascii=False)

    参考

    https://blog.csdn.net/th_num/article/details/80685389
    https://foofish.net/how-python3-handle-charset-encoding.html

    原文链接:https://blog.csdn.net/songyu0120/article/details/88680562

    作者:柒月
    Q群 :2122210(嵌入式/机器学习)
  • 相关阅读:
    python基础-第十二篇-12.1jQuery基础与实例
    python基础-第十一篇-11.2DOM为文档操作
    [LC] 170. Two Sum III
    [Algo] 11. Rainbow Sort
    [LC] 31. Next Permutation
    [LC] 994. Rotting Oranges
    [LC] 863. All Nodes Distance K in Binary Tree
    [Algo] 132. Deep Copy Undirected Graph
    [LC] 138. Deep Copy Linked List With Random Pointer
    [Algo] 118. Array Deduplication IV
  • 原文地址:https://www.cnblogs.com/Ph-one/p/14731553.html
Copyright © 2011-2022 走看看