![](/img/trans.png)
[英]Convert string with unicode characters e.g. →,∧,¬ into strings illustrated in latex?
[英]How to print unsupported unicode characters on Windows cmd as e.g. “?” instead of raising exception?
如果Windows cmd不支持的Unicode字符(代码点)(例如EN DASH“ –” )在Windows cmd终端中使用Python 3打印,则使用:
print('\u2013')
然后引发异常:
UnicodeEncodeError:'charmap'编解码器无法在位置0编码字符'\\ u2013':字符映射到<undefined>
有没有一种方法可以使print
将不支持的字符转换为“?”,或者以其他方式处理print
以允许执行继续?
更新资料
有更好的方法...请参阅下文。
必须有一个更好的方法,但这就是我目前能想到的:
print('\u2013'.encode(errors='replace').decode())
它使用encode()
将unicode字符串编码为您的默认编码,用?
替换对于该编码无效的字符?
。 将字符串转换为bytes
字符串,然后将其转换回Unicode,并保留替换的字符。
这是使用在GBK编码中无效的代码点的示例:
>>> s = 'abc\u3020def'
>>> print(s)
s.abc〠def
>>> s.encode(encoding='gbk')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'gbk' codec can't encode character '\u3020' in position 3: illegal multibyte sequence
>>> s.encode(encoding='gbk', errors='replace')
b'abc?def'
>>> s.encode(encoding='gbk', errors='replace').decode()
'abc?def'
>>> print(s.encode(encoding='gbk', errors='replace').decode())
abc?def
更新资料
因此,@ eryksun在评论中提到了一种更好的方法。 设置完成后,无需更改任何代码即可实现不受支持的字符替换。 下面的代码演示了行为之前和之后(我将首选编码设置为GBK):
>>> import os, sys
>>> print('\u3030')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'gbk' codec can't encode character '\u3030' in position 0: illegal multibyte sequence
>>> old_stdout = sys.stdout
>>> fd = os.dup(sys.stdout.fileno())
>>> sys.stdout = open(fd, mode='w', errors='replace')
>>> old_stdout.close()
>>> print('\u3030')
?
@eryksun评论提到分配Windows环境变量:
PYTHONIOENCODING=:replace
注意“替换”之前的“:”。 这看起来像是一个有用的答案,不需要使用print
在Python脚本中进行任何更改。
print('\–')
结果为:
?
和print('Hello\–world!')
结果为:
你好,世界!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.