Python UnicodeEncodeError:'ascii'编解码器无法编码字符

时间:2018-03-14 06:20:40

标签: python python-2.7

有一个包含一些中文字符的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"
  ]
}'

收到request.data的json数据后,我将其转换为json,实际上request.datastr

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 个答案:

答案 0 :(得分:2)

在Python 2中,当您openread文件时,您获得的是常规str,而不是unicode

同时,即使request.datastr而不是unicode,如果其中的任何字符串都是非ASCII,json_data将包含{{1} }}。

因此,当您执行unicode时,将使用您的默认编码尝试subtitles.format每个encode - 如果您还没有做任何事情,则为ASCII。哪个会给出这个错误。

最简单的解决方法是将unicode更改为subtitles。像这样:

unicode

......或:

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

(我猜你想要UTF-8;如果你的文件是其他编码,那么显然要使用它。)