在Python中将拉丁字符串转换为Unicode

4

我是在使用Scrapy进行开发,爬取了一些网站的数据并将数据存储到JSON文件中,但有些数据的格式如下:

l = ["Holding it Together",
     "Fowler RV Trip",
     "S\u00e9n\u00e9gal - Mali - Niger","H\u00eatres et \u00e9tang",
     "Coll\u00e8ge marsan","N\u00b0one",
     "Lines through the days 1 (Arabic) \u0633\u0637\u0648\u0631 \u0639\u0628\u0631 \u0627\u0644\u0623\u064a\u0627\u0645 1",
     "\u00cdndia, Tail\u00e2ndia & Cingapura"]

我可以预期列表中包含不同的格式,但我想将其转换并将字符串与它们的原始名称一起存储在列表中,如下所示。
l = ["Holding it Together",
     "Fowler RV Trip",
     "Lines through the days 1 (Arabic) سطور عبر الأيام 1 | شمس الدين خ | Blogs"         ,
     "Índia, Tailândia & Cingapura "]

Thanks in advance...........

2个回答

7

您有包含Unicode转义字符的字节字符串。您可以使用unicode_escape编解码器将它们转换为Unicode:

>>> print "H\u00eatres et \u00e9tang".decode("unicode_escape")
Hêtres et étang

同时你也可以将它编码回字节字符串:

>>> s = "H\u00eatres et \u00e9tang".decode("unicode_escape")
>>> s.encode("latin1")
'H\xeatres et \xe9tang'

您可以过滤和解码非unicode字符串,例如:

for s in l: 
    if not isinstance(s, unicode): 
        print s.decode('unicode_escape')

谢谢,我得到了准确的答案。 - Shiva Krishna Bavandla
实际上,当我在列表中使用Unicode字符串运行此命令时,我遇到了以下错误:“UnicodeEncodeError:'ascii'编解码器无法在位置1处编码字符u'\xe9':序数不在范围内(128)”。 - Shiva Krishna Bavandla
@shivakrishna 请查看我的更新答案,了解如何将其重新编码为字节字符串,但这可能会在阿拉伯字母中失败。如果您已经有Unicode,那么问题是什么? - schlamar
@shivakrishna 或者你有混合的字符串吗?Unicode 和 byte?在这种情况下,您可以使用 isinstance(s, unicode) 进行过滤,或者只需捕获 UnicodeDecodeError... - schlamar
你能提供一个如何过滤它们的示例吗? - Shiva Krishna Bavandla
显示剩余2条评论

1
我想将其转换并将字符串与其原始名称存储在列表中,如下所示。
当您序列化为JSON时,可能会有一个标志,允许您关闭非ASCII字符到\ u序列的转义。如果您正在使用标准库json模块,则为ensure_ascii。
>>> print json.dumps(u'Índia')
"\u00cdndia"
>>> print json.dumps(u'Índia', ensure_ascii= False)
"Índia"

然而请注意,如果取消了这个安全措施,您现在必须能够以正确的方式处理非ASCII字符,否则您将会遇到一堆UnicodeError。例如,如果您要将JSON写入文件,则必须显式地将Unicode字符串编码为所需的字符集(例如UTF-8)。

j= json.dumps(u'Índia', ensure_ascii= False)
open('file.json', 'wb').write(j.encode('utf-8'))

谢谢您的回答,我得到了我期望的确切答案。实际上,我想在JSON文件中显示字符串(不转义非ASCII字符)。现在通过上面的代码,我得到了输出,再次感谢。 - Shiva Krishna Bavandla
建议使用codecs模块将Unicode数据写入文件。请参阅http://docs.python.org/howto/unicode.html。如果没有安全关闭文件操作,请勿点踩。永远不要给出不良示例。 - schlamar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接