代码之家  ›  专栏  ›  技术社区  ›  CoXier

Python UnicodeEncodeError:“ascii”编解码器无法对字符进行编码

  •  3
  • CoXier  · 技术社区  · 6 年前

    有一个包含一些汉字的json数据。

    {
      "font_size": "47",
      "sentences": [
        "你好",
        "sample sentence1",
        "sample sentence2",
        "sample sentence3",
        "sample sentence4",
        "sample sentence5",
        "sample sentence6",
        "sample sentence7",
        "sample sentence8",
        "sample sentence9"
      ]
    }
    

    我创建一个 Flask 应用程序并使用它接收上述json数据。我使用下面的curl命令发布数据。

    curl -X POST \
      http://0.0.0.0:5000/ \
      -H 'Cache-Control: no-cache' \
      -H 'Content-Type: application/json;charset=UTF-8' \
      -H 'Postman-Token: af380f7a-42a8-cfbb-9177-74bb348ce5ed' \
      -d '{
      "font_size": "47",
      "sentences": [
        "你好",
        "sample sentence1",
        "sample sentence2",
        "sample sentence3",
        "sample sentence4",
        "sample sentence5",
        "sample sentence6",
        "sample sentence7",
        "sample sentence8",
        "sample sentence9"
      ]
    }'
    

    在我从接收json数据之后 request.data ,实际上,我将其转换为json 要求数据 str

    json_data = json.loads(request.data)
    

    然后我想用 json_data

    subtitles.format(**json_data)
    

    我出错了。

    UnicodeEncodeError:“ascii”编解码器无法对位置0-1中的字符进行编码:序号不在范围内(128)

    如何解决?提前谢谢。

    编辑

    subtitles 从文件中读取。

    subtitles_file = "{path}/templates/sorry/subtitles.ass".format(path=root_path)
    with open(subtitles_file, 'r') as file:
         subtitles = file.read()
    

    编辑Python 2或Python 3

    我使用的是python 2,出现了此错误。然而,Python 3可以自动处理这个问题。因此,请欣赏Python 3。

    1 回复  |  直到 6 年前
        1
  •  2
  •   abarnert    6 年前

    在Python 2中 open read 一个文件,你得到的是一个普通的 str ,不是 unicode

    与此同时,即使 request.data 是一个 str公司 而不是 unicode ,如果其中的任何字符串为非ASCII, json_data 将包含 unicode

    所以,当你这样做的时候 subtitles.format ,这将试图 encode 每个 unicode 使用您的默认编码,如果您没有做任何操作,则为ASCII。这将给出这个错误。

    最简单的解决方法是改变 subtitles 到a unicode 。像这样:

    with open(subtitles_file, 'r') as file:
        subtitles = file.read().decode('utf-8')
    

    或:

    with codecs.open(subtitles_file, 'r', 'utf-8') as file:
        subtitles = file.read()
    

    (我猜您需要UTF-8;如果您的文件采用其他编码,那么显然可以使用UTF-8。)