Python写(iPhone)表情符号到一个文件

时间:2013-07-08 18:18:20

标签: python python-2.7 unicode encoding emoji

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

操作系统:Ubuntu

Python版本:2.7.3

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

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

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

UnicodeEncodeError:'ascii'编解码器无法对位置7-8中的字符进行编码:序数不在范围内(128)

感谢任何可能的帮助。

1 个答案:

答案 0 :(得分:3)

此处最可能的问题是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个键和值。因此,用stdlib函数替换你用于JSON的任何东西都可能解决问题。

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


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

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

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