wtf*_*als 7 python unicode encoding python-2.7 emoji
我一直在尝试编写一个简单的脚本,可以将用户输入(源自iPhone)保存到文本文件中.我遇到的问题是,当用户使用表情符号图标时,它会打破整个事情.
操作系统:Ubuntu
Python版本:2.7.3
我的代码目前看起来像这样
f = codecs.open(path, "w+", encoding="utf8")
f.write("Desc: " + json_obj["description"])
f.close()
Run Code Online (Sandbox Code Playgroud)
当在描述变量中传递表情符号字符时,我收到错误:
UnicodeEncodeError:'ascii'编解码器无法编码位置7-8中的字符:序数不在范围内(128)
任何可能的帮助表示赞赏.
这里最可能的问题是它json_obj["description"]实际上是一个 UTF-8 编码的str,而不是unicode. 因此,当您尝试将write其转换为codecs-wrapped 文件时,Python 必须对其进行解码str,unicode以便对其进行重新编码。这就是失败的部分,因为自动解码使用sys.getdefaultencoding(),即'ascii'。
例如:
>>> f = codecs.open('emoji.txt', 'w+', encoding='utf-8')
>>> e = u'\U0001f1ef'
>>> print e
>>> e
u'\U0001f1ef'
>>> f.write(e)
>>> e8 = e.encode('utf-8')
>>> e8
'\xf0\x9f\x87\xaf'
>>> f.write(e8)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf0 in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
这里有两种可能的解决方案。
首先,您可以unicode尽早明确地解码所有内容。我不确定您json_obj的来源,但我怀疑它实际上不是 stdlib json.loads,因为默认情况下,它总是为您提供unicode键和值。因此,用 stdlib 函数替换您用于 JSON 的任何内容可能会解决问题。
其次,您可以将所有内容保留为 UTF-8str对象并保持二进制模式。如果您知道到处都有 UTF-8,只需open使用文件而不是codecs.open,并且无需任何编码即可写入。
此外,您应该强烈考虑使用io.open而不是codecs.open. 它有许多优点,包括:
codecs.唯一的缺点是它不向后兼容 Python 2.5。除非这对你很重要,否则不要使用codecs.
| 归档时间: |
|
| 查看次数: |
2809 次 |
| 最近记录: |