在Python中打印转义的Unicode

5 投票
4 回答
6354 浏览
提问于 2025-04-17 09:31
>>> 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&#223;en&#8230;
3
>>> s='auszuschließen…'
>>> s
'auszuschließen…'
>>> print(s)
auszuschließen…
>>> b=s.encode('ascii','xmlcharrefreplace')
>>> b
b'auszuschlie&#223;en&#8230;'
>>> print(b)
b'auszuschlie&#223;en&#8230;'
>>> b.decode()
'auszuschlie&#223;en&#8230;'
>>> print(b.decode())
auszuschlie&#223;en&#8230;

你一开始有一个Unicode字符串。将它编码成ascii格式后,会生成一个bytes对象,这个对象里包含了你想要的字符。Python不会直接打印这个对象,除非把它转换回字符串,而默认的转换方式会在前面加上b和引号。使用decode可以明确地把它转换回字符串;默认的编码方式是utf-8,而你的bytes只包含ascii字符,asciiutf-8的一部分,所以这个转换一定能成功。

撰写回答