如何在Python输出中获取西里尔字母?
我该怎么才能得到西里尔字母,而不是 u'...'
这样的格式呢?
代码是这样的:
def openfile(filename):
with codecs.open(filename, encoding="utf-8") as F:
raw = F.read()
do stuff...
print some_text
打印出来的结果是:
>>>[u'.', u',', u':', u'\u0432', u'<', u'>', u'(', u')', u'\u0437', u'\u0456']
3 个回答
0
u'\uNNNN'
是字符串字面量 u'з'
的一种安全版本,适合ASCII字符。
>>> print u'\u0437'
з
不过,这样显示的效果只有在你的控制台支持你要打印的字符时才会正确。如果你在一个西欧的Windows系统的控制台上尝试上面的代码,可能会失败:
>>> print u'\u0437'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\encodings\cp437.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u0437' in position 0: character maps to <undefined>
因为在Windows控制台输出Unicode字符比较麻烦,所以Python 2的 repr
函数总是选择ASCII安全的字面量版本。
你的 print
语句输出的是 repr
版本,而不是直接打印字符,因为你把字符放在了一个字符列表里,而不是字符串里。如果你对列表里的每个成员单独使用 print
,那么你会直接看到字符,而不是以 u'...'
的形式显示。
3
我不太明白some_text
是从哪里来的(你把那部分代码删掉了),所以我不知道为什么它会以字符列表的形式打印出来,而不是作为一个字符串。
不过你要知道,默认情况下,Python在你打印字符串到终端时,会尝试用ASCII编码。如果你想用其他编码方式,可以明确地指定:
>>> text = u'\u0410\u0430\u0411\u0431'
>>> print text
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3:
ordinal not in range(128)
>>> print text.encode('utf8')
АаБб
4
看起来 some_text
是一个包含unicode对象的列表。当你打印这个列表的时候,它会显示列表里每个元素的表示形式。所以你可以试试这样:
print(u''.join(some_text))
join 方法可以把 some_text
里的元素用一个空格 u''
连接起来。这样最后得到的就是一个unicode对象。