如何在Python中打印非ASCII字符

7
我在Python中打印(或写入文件)非ASCII字符时遇到了问题。我通过覆盖自己对象的str方法并在其中进行“x.encode('utf-8')”,其中x是对象内的属性,来解决了这个问题。
但是,如果我接收到一个第三方对象,并且我执行“str(object)”,并且此对象内有非ASCII字符,则会失败。
因此问题是:是否有任何方式可以通用地告诉str方法该对象具有UTF-8编码?我正在使用Python 2.5.4。

“接收第三方对象”是什么意思?是哪个第三方对象?为什么不能信任这个神秘的对象来生成正确的字符串值? - S.Lott
我正在与其他不是由我制作的程序进行交互。这些程序可能具有带有非ASCII字符的字符串属性的对象。 - Roman
5个回答

10

在 Python < 3.0 中,无法使 str() 与 Unicode 协同工作。

请使用 repr(obj) 替代 str(obj)repr() 将结果转换为 ASCII 码,并正确转义不在 ASCII 码范围内的所有内容。

除此之外,请使用允许 Unicode 的文件对象。因此,在输入侧不要进行编码,而是在输出侧进行编码:

fileObj = codecs.open( "someFile", "w", "utf-8" )

现在您可以将Unicode字符串写入fileObj,它们将根据需要进行转换。要使同样的事情在print中发生,您需要包装sys.stdout

import sys, codecs, locale
print str(sys.stdout.encoding)
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
line = u"\u0411\n"
print type(line), len(line)
sys.stdout.write(line)
print line

但是当我使用print(object)时,我遇到了同样的问题,因为它在内部调用了str函数,所以如果对象中有非ASCII字符,就会失败。我看到可以将以下内容放在我的files.py文件的第一行:

-- coding: utf-8 --

但是它并没有起作用。
- Roman
源文件的编码与str()支持的内容无关。在py3k中,str()仅支持Unicode字符,因此请在所有地方使用repr()unicode() - Aaron Digulla

4
none_ascii = '''
        ███╗   ███╗ ██████╗ ██╗   ██╗██╗███████╗███████╗ 
        ████╗ ████║██╔═══██╗██║   ██║██║██╔════╝██╔════╝ 
        ██╔████╔██║██║   ██║██║   ██║██║█████╗  ███████╗ 
        ██║╚██╔╝██║██║   ██║╚██╗ ██╔╝██║██╔══╝  ╚════██║ 
        ██║ ╚═╝ ██║╚██████╔╝ ╚████╔╝ ██║███████╗███████║ 
        ╚═╝     ╚═╝ ╚═════╝   ╚═══╝  ╚═╝╚══════╝╚══════╝ 
'''

print(none_ascii.decode('utf-8'))

3

你可以在类中使用unicode(object)并定义__unicode__方法,这样你就知道了对象的Unicode表示,并且可以将其编码为任何你想要的文件。


但是我还是面临同样的问题:如果我收到一个第三方对象并使用“unicode(object)”,而该对象具有非ASCII字符,那么它不会失败吗? - Roman
此外,当我使用“print(object)”时,它内部调用str方法,因此我无法使用unicode。 - Roman
还有一个问题:如果我使用Python 3,我不会遇到这些问题吗?Python3可以自动进行转换吗?它默认接受非ASCII字符吗? - Roman
所有的Python 3字符串默认都是(曾经的)Unicode。 - mavnn
首先,请注意,如果您收到一个字节数组,它本质上是Python字符串,那么无法确定它使用的编码方式。如果有第三方对象提供非标准编码的字符串,则应该同时提供其所使用的编码方式。 - Kugel

2
我想说我在Unix系统中找到了一个解决方案,可以通过导出环境变量来实现,具体操作如下:
export LC_CTYPE="es:ES.UTF-8"
这样,所有文件都是utf-8编码的,因此我可以进行打印或其他操作,并且一切正常运行。

这与你的问题有什么关系?或者与Python有什么关系? - Kugel

0

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