一种抑制unicodeen错误的打印机
safeprint的Python项目详细描述
抑制Unicodeen错误的打印机。
安装
pip install safeprint
用法
基本:
from safeprint import print print("你好世界!" "こんにちは世界" "안녕하세요세계")
钩子回调:
import safeprint # create a printer printer = safeprint.Printer() def callback(text): # do something with the text printer.add_listener(callback) printer.print(1, 2, 3, sep=", ") printer.remove_listener(callback)
python 2的注释
如果向print函数发送str对象,safeprint将使用utf-8编码将其编码为unicode对象。
工作原理
Python3
打印到控制台
在打印之前,python对文本based on the encoding of your console进行编码,这在linux中通常是“utf-8”。在windows下,可以使用cmd命令chcp检查默认代码页。
因此,如果python不能使用编码对文本进行编码,则会引发“unicodeencodeerror”。可以通过在运行python之前将console encoding-run commandchcp 65001切换到utf-8来解决这个问题。
safeprint的作用是使用win-unicode-console,它使用winapi将unicode字符串写入控制台。
另外,在python 3.6之后,python has builtin support for that,这样就不再需要win unicode控制台了。
打印到文件(重定向输出)
这会导致“unicodeencodeerror”,因为python使用系统代码页作为stdios的默认编码。要解决这个问题,您应该将环境变量“PYTHONIOENCODING”设置为“utf-8”,这使得python使用utf-8作为编码。
safeprint所做的就是总是用utf-8编码文本,然后直接将字节写入stdout。
Python2
在python 2中,bytes和str没有区别,str只是一系列字节,这是python从源代码中实际读取的。如果您编写相同的字符串,但以不同的编码保存在不同的源文件中,python也将获得不同的字节序列。
打印到控制台
因为字节和str之间没有区别,所以将str写入控制台只是将字节写入控制台,永远不会引发unicodeeror。但是,如果控制台的编码与源代码的编码不匹配(而Python2与CP65001的工作不太好,切换代码页不工作),则可能会出现混乱。
当打印unicode对象时,python将尝试使用python 3这样的控制台编码将其编码为字节,这可能会导致unicodeenor错误。
解决方案与Python3中的相同。SafePrint使用Win Unicode控制台打印Unicode文本。
打印到文件(重定向输出)
如前所述,bytes和str没有区别,在将str打印到文件时,实际上只是将一系列字节写入文件,这永远不会引发unicodeenderor。
但是,在打印unicode对象时,python必须根据python的默认编码将unicode编码为字节(您可以通过运行这个python脚本import sys; print(sys.getdefaultencoding())来检查默认编码,python 2中默认为“ascii”)。因此,如果python无法对unicode对象进行编码,unicodeencodeerror的打印将失败。
要解决这个问题,您可以设置环境变量“pythonionecoding”,或者在将unicode对象发送到打印函数之前使用utf-8对其进行编码,这就是safeprint所做的。
更改日志
- 0.2.0(2017年3月1日)
- 支持Python2。
- 为重定向输出添加打印机。
- 放下EchoPrinter。
- 0.1.4(2016年12月31日)
- 使WinUnicode控制台在Python3.6中成为可选。
- 0.1.2(2016年7月21日)
- 与Win Unicode控制台0.5兼容
- 0.1.1(2016年4月15日)
- 修复内置错误。
- 0.1.0(2016年4月15日)
- 初次发布。