如何在 Python 中打印非 ASCII 字符

Posted

技术标签:

【中文标题】如何在 Python 中打印非 ASCII 字符【英文标题】:How to print non-ASCII characters in Python 【发布时间】:2010-12-14 23:47:19 【问题描述】:

当我在 Python 中打印(或写入文件)非 ASCII 字符时遇到问题。我通过在我自己的对象中覆盖 str 方法并在其中创建“x.encode('utf-8')”来解决它,其中 x 是对象内部的一个属性。

但是,如果我收到一个第三方对象,并且我制作了“str(object)”,而这个对象里面有一个非 ASCII 字符,它就会失败。

所以问题是:有什么方法可以告诉str 方法该对象通常具有UTF-8 编码?我正在使用 Python 2.5.4。

【问题讨论】:

“接收第三方对象”是什么意思?什么第三方对象?为什么不能信任这个神秘的对象来产生正确的字符串值? 我正在与不是我制作的其他程序进行交互。这些程序可以拥有具有字符串属性的对象,其中可以包含非 ascii 字符 【参考方案1】:

没有办法让str() 在 Python

使用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 -- 但它不起作用 源文件的编码与str()支持什么无关。 str() 在 py3k 中只支持 unicode 字符,所以要么在任何地方使用 repr() 要么 unicode()。【参考方案2】:

您如何使用unicode(object) 并在您的类上定义__unicode__ 方法?

然后你知道它的 unicode 并且你可以将它编码成任何你想要的文件。

【讨论】:

但是我遇到了同样的问题:如果我收到第三方对象并且我使用“unicode(object)”,并且该对象具有非 ascii 字符,它将失败,获胜不是吗? 另外,当我使用“print(object)”时,内部会调用str方法,所以我不能使用unicode 还有一个问题:如果我使用python 3,我会不会有这些问题? Python3 单独进行转换?它是否默认接受非ASCII字符? 默认情况下,所有 Python 3 字符串都是(过去的)unicode。 首先,请意识到,如果您接收到字节数组,则基本上是巫婆字符串,无法确定它的编码是什么。如果有第三方对象给您非标准编码的字符串,它们还应该提供它的编码。【参考方案3】:
none_ascii = '''
        ███╗   ███╗ ██████╗ ██╗   ██╗██╗███████╗███████╗ 
        ████╗ ████║██╔═══██╗██║   ██║██║██╔════╝██╔════╝ 
        ██╔████╔██║██║   ██║██║   ██║██║█████╗  ███████╗ 
        ██║╚██╔╝██║██║   ██║╚██╗ ██╔╝██║██╔══╝  ╚════██║ 
        ██║ ╚═╝ ██║╚██████╔╝ ╚████╔╝ ██║███████╗███████║ 
        ╚═╝     ╚═╝ ╚═════╝   ╚═══╝  ╚═╝╚══════╝╚══════╝ 
'''

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

【讨论】:

【参考方案4】:

我想说我在 Unix 系统中找到了一个解决方案,导出一个环境变量,用这个:

导出 LC_CTYPE="es:ES.UTF-8"

这样,所有文件都在 utf-8 中,所以我可以打印或其他任何东西都可以正常工作

【讨论】:

这与您的问题有什么关系?还是用python?【参考方案5】:

只需将这两行粘贴到代码的顶部

    #!/usr/local/bin/python # 编码:latin-1

访问此链接了解更多详情https://www.python.org/dev/peps/pep-0263/

【讨论】:

以上是关于如何在 Python 中打印非 ASCII 字符的主要内容,如果未能解决你的问题,请参考以下文章

在 Matlab 中打印非 ASCII / 符号字符

在ASCII码字符编码中,啥字符无法显示或打印出来

Python:如何解决SyntaxError:非ASCII字符?

如何在 Hadoop/PIG 中处理非 ASCII/亚洲/中文字符

VB6.0 中 CHR() 函数如何使用? 还有特殊符号的 ASCII 码是多少? 如回车 空格

ASCII 码表对照