一种抑制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日)
    • 初次发布。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Admob不使用webview   Java Wicket表单:序列化对象类“myClassName”时出错   java googledriveapi更新文件与我的帐户管理员   java简单框架未知xml标记解析   java如何使用主类和用户获取Spark应用程序ID   java如何更改自定义属性的值?   java有没有办法在jMock中找到未使用的期望值?   gradle运行任务的java文档?   java通过使用数组来存储文本文件的行,通过覆盖来删除文本文件中的行   用于表达式语言注入的java利用负载   java IDEStyle程序运行   java在运行时启用/禁用Springws   爪哇芦苇。formatNumber NullPointException   java为什么我的代码无法检测两个动态实体之间的碰撞?