【问题标题】:Decoding non standard characters to UTF 8 in Python在 Python 中将非标准字符解码为 UTF 8
【发布时间】:2017-07-29 04:34:18
【问题描述】:

我有一个程序,它通过 Django 中的 webhook(用 Python 编写)接收字节编码的文本。我已经从字节解码 -> utf-8 为普通字母工作,但是当一个撇号( ' )被发送时它会中断。我写这个来解码文本:

encoded = request.body
decoded = parse_qs(encoded)
body = decoded[b'body'][0].decode("utf-8")

这是错误:

UnicodeEncodeError: 'ascii' codec can't encode character '\u2019' in position 5: ordinal not in range(128)

我希望它能够成功解码撇号。我还担心如果发送表情符号可能会中断,因此我希望能够转义表情符号和∫等随机字符,但仍保留消息中的真实单词。

【问题讨论】:

  • “从字节解码 -> utf-8”是什么意思? UTF-8 是一种将 Unicode 文本编码为字节序列的方式,因此您可以将 Unicode 字符串编码为 UTF-8 字节,也可以将 UTF-8 字节解码为 Unicode 字符串。

标签: python django encoding utf-8 decoding


【解决方案1】:

parse_qs 将使用解码的 utf 字符串,但会阻塞非 ascii 字节。例如:

这失败了:

a = b'restaurant_type=caf\xc3\xa9'
urllib.parse.parse_qs(a)
# > UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3...etc

但这没问题:

a = b'restaurant_type=caf\xc3\xa9'
urllib.parse.parse_qs(a.decode())
# > {'restaurant_type': ['café']}

这就是你要问的吗?

【讨论】:

  • 是的,谢谢 - 我认为我的解析和解码顺序错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
相关资源
最近更新 更多