《Python Cookbook(第2版)中文版》——1.22 在标准输出中打印Unicode字符

简介:

本节书摘来自异步社区《Python Cookbook(第2版)中文版》一书中的第1章,第1.22节,作者[美]Alex Martelli , Anna Martelli Ravenscrof , David Ascher ,高铁军 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.22 在标准输出中打印Unicode字符

任务

你想将Unicode字符串打印到标准输出中(比如为了调试),但是这些字符串并不符合默认的编码。

解决方案

通过Python标准库中的codecs模块,将sys.stdout流用转换器包装起来。比如,如果你知道输出会被打印到一个终端,而且该终端以ISO-8859-1的编码显式字符,可以这样编写代码:

import codecs, sys
sys.stdout = codecs.lookup('iso8859-1')[-1](sys.stdout)

讨论

Unicode涵盖极广,全世界的语言字符都在Unicode的表示范围之内,另外,Unicode字符串的内部表示也与Unicode使用者没有关系。一个用于处理字节的文件流,比如sys.stdout,都有自己的编码。可以通过修改site模块改变其默认的编码,该文件流将对新文件使用新编码。不过,这样也需要完全改变你的Python安装,而且其他一些程序则可能会被搞乱,它们依然会按照你原先的编码设置工作(一般是典型的Python标准编码,ASCII)。因此,这种修改并不值得推荐。

本节的方法则用了一个技巧:将sys.stdout绑定到一个使用Unicode输入和ISO-8859-1(也就是Latin-1)输出的流。这种方法并不改变之前sys.stdout上的任何编码,如下面代码所示。首先,我们用一个变量指向原来的基于ASCII的sys.stdout:

>>> old = sys.stdout

然后,我们可以创建一个Unicode字符串,这个字符串通常情况下是不能通过sys.stdout输出的:

>>> char = u"\N{LATIN SMALL LETTER A WITH DIAERESIS}"
>>> print char
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeError: ASCII encoding error: ordinal not in range(128)

如果这个操作没有出现错误,那是因为Python认为它知道你的“终端”用了什么编码(特别是,如果你的“终端”是IDLE—Python所附的免费的开发环境,Python极有可能能够确认正确的编码)。如果出现了错误,或者没有提示错误,但是输出的字符却不是你期望的,那是因为你的“终端”使用了UTF-8编码,而Python却不知道。如果属于后者的情况,可以用codecs流对sys.stdout进行包装以解决UTF-8编码问题,将sys.stdout绑定到被封装过的流,然后重新试一次:

>>> sys.stdout = codecs.lookup('utf-8')[-1](sys.stdout)
>>> print char
ä

这个方法只在你的“终端”、终端模拟器或者其他类型的交互式Python解释窗口支持UTF-8编码时才有效,而且具有极强的字符表现力,能够显示出任何需要的字符。如果没有这样的程序或设备,可以在因特网上找一个适用于你的平台的免费的程序。

Python会尝试确认你的“终端”的编码,并把编码的名字存在sys.stdout.encoding中作为一个属性。有时(但不是总是),它能够判断出正确的编码。IDLE已经对sys.stdout进行了包装,正如本节解决方案的方法一样,所以,在Python的交互式环境之下,可以直接打印出Unicode字符串。

相关文章
|
9天前
|
存储 计算机视觉 Python
python实现Gif图片的字符画
这是一个Python实战项目,旨在将GIF动态图转化为ASCII字符动画。项目适合有一定Python基础的学习者,主要使用os、imageio、PIL库。首先,代码导入所需库,然后通过PIL创建空白图片并添加文本。接着,程序读取GIF,拆分帧并转为字符画,存入“tmp”目录。同时,代码提供了清空“tmp”目录、将灰度值映射为ASCII字符、将图片处理成字符画的函数。此外,还有创建新画布和合成GIF的步骤。主函数调用这些模块,最终将ASCII字符画合并成GIF。项目展示了将动态图像转换为ASCII艺术的过程。
|
2月前
|
索引 Python
Python 超高频常见字符操作【建议收藏】
Python 超高频常见字符操作【建议收藏】
|
3月前
|
Python
在Python中实现图片转字符画灰度处理或灰色量化
在Python中实现图片转字符画灰度处理或灰色量化
26 1
|
3月前
|
计算机视觉 Python
在Python中实现图片转字符画打开图片
在Python中实现图片转字符画打开图片
14 1
|
3月前
|
Python
在Python中实现图片转字符画导入所需库
在Python中实现图片转字符画导入所需库
14 1
|
3月前
|
存储 算法 计算机视觉
在Python中实现图片转字符画
在Python中实现图片转字符画
15 1
|
4月前
|
算法 Python Java
Python每日一练(20230426) 删除重复字符、颜色分类、计算圆周率
Python每日一练(20230426) 删除重复字符、颜色分类、计算圆周率
42 0
Python每日一练(20230426) 删除重复字符、颜色分类、计算圆周率
|
4月前
python-capitalize() 方法:将字符串的第一个字符转换为大写,其余字符转换为小写
python-capitalize() 方法:将字符串的第一个字符转换为大写,其余字符转换为小写
20 0
|
4月前
|
Python
Pycharm 如何更改成中文版| Python循环语句| for 和 else 的搭配使用
Pycharm 如何更改成中文版| Python循环语句| for 和 else 的搭配使用
22 0
|
4月前
|
JSON 数据格式 Python
Python获取指定字符前面的所有字符
Python获取指定字符前面的所有字符
14 0