在Python中打印转义的Unicode
>>> 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>
4 个回答
1
并不是所有的终端都能处理超过某种8位字符集的内容,这点是没错的。不过,不管你怎么做,它们都无法处理这些字符。
如果你打印一个Unicode字符串,假设你的操作系统已经正确设置了终端,那么结果会是尽可能好的。这意味着终端无法打印的字符会被替换成某个字符,比如问号或者类似的东西。自己去做这种替换其实并不会改善情况。
更新:
既然你想知道字符串里有哪些字符,实际上你是想知道它们的Unicode编码,或者在这种情况下的XML等价物。这更多是检查而不是打印,通常情况下,b''部分本身并不是问题。
不过你可以像这样简单又巧妙地去掉它:
print(repr(s.encode('ascii', errors='xmlcharrefreplace'))[2:-1])
4
如果你想查看 ASCII 表示(就像 Python 2 中的 repr()
函数)来帮助调试的时候,可以使用以下方法:
print(ascii('auszuschließen…'))
# -> 'auszuschlie\xdfen\u2026'
如果你想打印字节内容,可以使用:
sys.stdout.buffer.write('auszuschließen…'.encode('ascii', 'xmlcharrefreplace'))
# -> auszuschließen…
3
>>> 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
字符,ascii
是utf-8
的一部分,所以这个转换一定能成功。