【问题标题】:printing and writing Unicode characters in Python在 Python 中打印和写入 Unicode 字符
【发布时间】:2016-12-04 08:40:18
【问题描述】:

我正在尝试将一些 Unicode 字符打印出来或写入文本文件并遇到错误..请建议,尝试 google 给了我一些提示,但那个错误也被编辑了..下面是我的代码..我在这里可能做错了什么..

我正在尝试最终使用“请求”并使用具有 Unicode 值的数据解析 JSON..

我正在尝试使用来自此 url 的请求来解析 JSON

https://api.discogs.com/releases/7828220

try:
        import requests
import json
url = 'https://api.discogs.com/releases/7828220'
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0' }
art = requests.get(url, headers=headers)
json_object = json.loads(art.text)
try:
    print str(json_object['companies'][0][name])
except:
    print "Genre list isn't defined"

    {u'name': u'\u041e\u041e\u041e "\u041f\u0430\u0440\u0430\u0434\u0438\u0437"', u'entity_type': u'10', u'catno': u'PARAD-432', u'resource_url': u'https://api.discogs.com/labels/210403', u'id': 210403, u'entity_type_name': u'Manufactured By'}

这里的 json_object['companies'][0][name] 有一些 Unicode 字符不会显示在命令行终端上,也不会写入具有所需输出 (Unicode) 的文件

Actual output looks like "ООО "Парадиз"", 

如何让 python 解释这些值?

【问题讨论】:

  • 错误是什么?问题是什么?
  • 顺便说一句 bytes = u'' 已经是一个 unicode 字符串
  • 你确定你的终端字体支持那些缺失的字符吗?

标签: python unicode python-unicode


【解决方案1】:

您的“字节”已经是 unicode,所以应该没有错误。

>>> bytes = u'\xd0\x9e\xd0\x9e\xd0\x9e"\xd0\x9f\xd0\xb0\xd1\x80\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xb7"'
>>> print unicode(bytes) 
ÐÐÐ "ÐаÑадиз"

但是,如果您将 python2 字符串/字节串(不带u"" 前缀)转换为 unicode,则默认编码为 ascii。

>>> bytes = '\xd0\x9e\xd0\x9e\xd0\x9e"\xd0\x9f\xd0\xb0\xd1\x80\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xb7"'
>>> print unicode(bytes)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)

此处使用的正确编码是 UTF8。您可以告诉unicode() 使用哪种编码。

>>> print unicode(bytes, 'utf8')
ООО "Парадиз"

【讨论】:

  • Unicode 在 python 3 中以更合理的方式处理。如果您是 python 新手,我强烈建议您使用它而不是 python 2。
  • 我建议即使你不是 python 新手
【解决方案2】:

不会显示在命令行终端上

你得到什么错误?无论如何,如果您在支持 UTF-8 的终端(例如 Linux)上删除不必要的 str() 转换并引用 'name',则以下操作有效:

import requests
import json

url = 'https://api.discogs.com/releases/7828220'
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0' }
art = requests.get(url, headers=headers)
json_object = json.loads(art.text)
print json_object['companies'][0]['name']

输出:

ООО "Парадиз"

在 Windows 上,命令控制台可能不会默认使用支持您尝试打印的字符的编码。一种简单的方法是切换到支持的编码,在这种情况下,chcp 1251 将代码页更改为支持俄语的代码页,这样就可以完成上述工作。

要将其写入文件,请使用带有编码的io.open

import io
with io.open('output.txt','w',encoding='utf8') as f:
    f.write(json_object['companies'][0]['name'])

【讨论】:

  • 感谢您的详细解释,我使用的是 Windows 10 并且命令行终端不支持字体,但我想知道为什么它不会写入带有这些俄语字符的文件,而是使用代码你展示了,它有效!谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2018-06-22
相关资源
最近更新 更多