【问题标题】:Python write (iPhone) Emoji to a filePython将(iPhone)表情符号写入文件
【发布时间】:2013-07-06 04:22:39
【问题描述】:

我一直在尝试编写一个简单的脚本,可以将用户输入(来自 iPhone)保存到文本文件中。我遇到的问题是,当用户使用 Emoji 图标时,它会破坏整个事情。

操作系统:Ubuntu

Python 版本:2.7.3

我的代码目前看起来像这样

f = codecs.open(path, "w+", encoding="utf8")
f.write("Desc: " + json_obj["description"])
f.close()

在描述变量中传递表情符号字符时,我收到错误:

UnicodeEncodeError: 'ascii' codec can't encoding characters in position 7-8: ordinal not in range(128)

感谢任何可能的帮助。

【问题讨论】:

  • json_obj["description"]unicode 还是 str?如果是后者,它是什么编码?另外,您能否在错误之前print repr(json_obj["description"]),以便我们可以看到您实际尝试打印的内容?
  • 另外,json_obj 来自哪里?名称暗示 stdlib json 模块,但键和值显然是 str 的事实意味着它不是……

标签: python python-2.7 unicode encoding emoji


【解决方案1】:

这里最可能的问题是 json_obj["description"] 实际上是 UTF-8 编码的 str,而不是 unicode。因此,当您尝试将write 转换为codecs 包装文件时,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)

这里有两种可能的解决方案。

首先,您可以尽早将所有内容显式解码为unicode。我不确定你的json_obj 来自哪里,但我怀疑它实际上不是stdlib json.loads,因为默认情况下,它总是给你unicode 键和值。因此,将您用于 JSON 的任何内容替换为 stdlib 函数可能会解决问题。

其次,您可以将所有内容保留为 UTF-8 str 对象并保持二进制模式。如果您知道到处都有 UTF-8,只需 open 文件而不是 codecs.open,并且无需任何编码即可写入。


此外,您应该强烈考虑使用io.open 而不是codecs.open。它有很多优点,包括:

  • 如果您传递不正确的值,则会引发异常而不是做错事。
  • 通常更快。
  • 与 Python 3 前向兼容。
  • 修复了许多永远不会向后移植到 codecs 的错误。

唯一的缺点是它不向后兼容 Python 2.5。除非这对你很重要,否则不要使用codecs

【讨论】:

    猜你喜欢
    • 2018-05-02
    • 2020-04-23
    • 1970-01-01
    • 2017-05-11
    • 2021-10-29
    • 2016-05-10
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多