首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将(iPhone) Emoji写入文件

将(iPhone) Emoji写入文件
EN

Stack Overflow用户
提问于 2013-07-08 18:18:19
回答 1查看 5.4K关注 0票数 7

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

操作系统: Ubuntu

Python版本: 2.7.3

我的代码当前如下所示

代码语言:javascript
复制
f = codecs.open(path, "w+", encoding="utf8")
f.write("Desc: " + json_obj["description"])
f.close()

当在description变量中传递Emoji字符时,我得到错误:

UnicodeEncodeError:'ascii‘编解码器不能在7-8位置编码字符:序数不在范围内(128个)

任何可能的帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2013-07-08 18:29:01

这里最可能的问题是,json_obj["description"]实际上是一个UTF-8编码的str,而不是unicode.因此,当您尝试将其writecodecs-wrapped文件时,Python必须将其从str解码为unicode,以便重新编码。这是失败的部分,因为自动解码使用的是sys.getdefaultencoding(),也就是'ascii'

例如:

代码语言:javascript
复制
>>> 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的bug修复程序。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17533363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档