>>> s = 'auszuschließen'
>>> print(s.encode('ascii', errors='xmlcharrefreplace'))
b'auszuschließen'
>>> print(str(s.encode('ascii', errors='xmlcharrefreplace'), 'ascii'))
auszuschließen
在没有b''
的情况下打印任何字符串是否有更漂亮的方法?
编辑:
我只是想从Python打印转义字符,我唯一的抱怨是Python在我这样做的时候加了“b”'。
如果我想看到像Windows 7这样的哑终端中的实际角色,那么我明白了:
Traceback (most recent call last):
File "Mailgen.py", line 378, in <module>
marked_copy = mark_markup(language_column, item_row)
File "Mailgen.py", line 210, in mark_markup
print("TP: %r" % "".join(to_print))
File "c:\python32\lib\encodings\cp437.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2026' in position 29: character maps to <undefined>
答案 0 :(得分:3)
要查看ascii表示(如Python 2上的repr()
)以进行调试:
print(ascii('auszuschließen…'))
# -> 'auszuschlie\xdfen\u2026'
打印字节:
sys.stdout.buffer.write('auszuschließen…'.encode('ascii', 'xmlcharrefreplace'))
# -> auszuschließen…
答案 1 :(得分:2)
>>> s='auszuschließen…'
>>> s
'auszuschließen…'
>>> print(s)
auszuschließen…
>>> b=s.encode('ascii','xmlcharrefreplace')
>>> b
b'auszuschließen…'
>>> print(b)
b'auszuschließen…'
>>> b.decode()
'auszuschließen…'
>>> print(b.decode())
auszuschließen…
您从Unicode字符串开始。将其编码为ascii
会创建一个包含所需字符的bytes
对象。 Python不会将其打印而不将其转换回字符串,默认转换会放入b
和引号。使用decode
显式将其转换回字符串;默认编码为utf-8
,由于您的bytes
仅由ascii
组成,utf-8
是{{1}}的子集,因此可以保证其正常工作。
答案 2 :(得分:1)
并非所有终端都可以处理超过某种8位字符集,这是真的。但无论你做什么,他们都不会处理,真的。
打印Unicode字符串,假设您的操作系统设置正确,可以获得最佳结果,这意味着终端无法打印的字符将替换为某些字符,如问号或类似字符。自己做这个翻译并不能真正改善事情。
更新
由于您想知道字符串中的字符是什么,因此您实际上想知道它们的Unicode代码,或者在这种情况下是XML等价物。这比印刷检查更多,然后通常b''部分本身不是问题。
但是你可以轻易地和黑客一样摆脱它:
print(repr(s.encode('ascii', errors='xmlcharrefreplace'))[2:-1])
答案 3 :(得分:0)
由于您使用的是Python 3,因此您可以将print(s)
写入控制台。
我同意这一点,取决于控制台,它可能无法正常打印,但我认为自2006年以来大多数现代操作系统都可以处理Unicode字符串而不会出现太多问题。我鼓励你试一试,看看它是否有效。
或者,您可以通过在文件(类似于shebang)中的任何行之前放置编码来强制执行编码:
# -*- coding: utf-8 -*-
这将强制解释器将其呈现为UTF-8。