如何在Python输出中获取西里尔字母?

4 投票
3 回答
20618 浏览
提问于 2025-04-16 06:45

我该怎么才能得到西里尔字母,而不是 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对象。

撰写回答