又一次, 被Python的编码问题搞得焦头烂额. 过去的记忆中, Python给我的印象之一就是让人痛不欲生的编码问题, 后来基本不碰Python很可能与此有关. 这次又用到Python了, 基本上, 整个过程还是比较顺畅的, Python在某些问题上面的确有优势. 但是不可避免的又碰到编码问题.

编码问题是那种你希望永远不要碰到, 而一旦碰到就会很头疼的一类问题. 是一种在解决实际问题过程中不可避免会碰到的不愉快的小插曲之一.

事情是这样, 在Python中调用win32的api, 枚举所有活动的窗口, 得到窗口的句柄, 窗口标题, 和窗口类名, 拿到这些数据之后, 用print 输出到控制台中. 开始一切都很好, 突然某次在运行的时候出错: UnicodeEncodeError, 但是之前都没有报过错, 而且接下来问题时有时无.

原因在于, Chrome浏览器窗口的标题是可以包含特殊字符的, 这里面的文本可能是任何东西, 有些时候标题中的字符都能用gbk表示, 有时候就会包含特殊字符.

例如, 打开某个页面, 碰巧标题是下面的字符串:

how to create a windows service in python « Python recipes « ActiveState Code

这里面的字符«就是unicode字符, 在gbk中是不存在的, 在HTML用

«

来表示.

如果在cmd中运行脚本, print到控制台中会抛出UnicodeEncodeError异常. 因为默认cmd里面的编码是gbk, print要想输出则必须先将unicode转换为gbk, 然而gbk里面没有某些unicode字符的对应字符, 结果就抛出异常:

UnicodeEncodeError: 'gbk' codec can't encode character '\xab' in position 42: illegal multibyte sequence

来分析一下原因, 首先, 从窗口中取得的标题字符串是unicode的, 那么print函数要将其输出到控制台, 必须变成控制台的编码, 在windows里, 控制台的编码就是gbk. 在print函数内部必然要用encode将unicode变成gbk, 如果unicode中包含了gbk所不能表示是字符, 则根据error handling的值决定下一步动作, 而Python的默认error handling是'strict', 也就是当不能encode的时候抛出异常. 这就是事情的全过程.

这一点Python处理的很特别, 按照一般的原则, 像编码解码这样的东西, 即使有问题, 无非乱码而已, 而Python却一定要报错, 现在整个脚本因为这个并不重要的因素而无法运行了.

其实像这种场景, print函数即使输出乱码, 很多时候并不会影响整个脚本的功能, 一般的愿望是希望脚本正常运行下去.

这实际也是大部分平台的处理方式.

那么怎样即能够输出又不影响阅读呢?

这里推荐一种方法

print ("title: " , unicode_str.encode('gbk', 'backslashreplace').decode('gbk', 'backslashreplace'))

输出结果是

title: how to create a windows service in python \xab Python recipes \xab ActiveState Code - Google Chrome

先encode, 用backslashreplace处理特殊字符, 完成之后得到的字节流中特殊字符被转义字符取代了, 然后再decode为unicode, 该unicode交给print的时候, 其中的特殊字符已经变成可以用gbk表示的东西了, 其实就是用对应的数字.

其实这本来应该是我预想中的应有的默认行为, 但是现在必须自己手动处理. 更何况处理的手段还非常的ugly, 如果碰到大量的地方需要修改, 又或者需要print复合数据结构, 例如print list 或者dictionary, 或者pair之类的. 必须找更好的解决办法, 例如改变系统encode的时候的默认error handling, 不要用'strict'. 既然有默认配置, 按理应该是可以修改的, 不过还不知道怎么去做, 也找不到相关的文档.

python 输出字符串编码_Python print 字符串编码问题相关推荐

  1. python字符串输入_Python输入字符串的方法和实例代码

    Python怎么输入字符串 首先,要显示字符串,直接 print(字符串) 就可以显示了. 字符串可以用单引号或者双引号,python中没有字符类型. 多个字符串直接连着写,就表示连接,字符串内部的转 ...

  2. Python基础(2)print字符串与布尔变量的输出

    Python基础(2)print中+和,的区别与字符串强制类型转换 在Python基础(1)文末我记录了输出时用+和,连接字符串的区别,似乎仅仅是排版不同,其实不然,在输出单纯的双引号内的字符串时,二 ...

  3. [转载] python 遍历字符串 字符_python 遍历字符串(含汉字)实例详解

    参考链接: Python字符串| rfind python 遍历字符串(含汉字)实例详解 python 遍历字符串(含汉字)实例详解 s = "中国china" for j in ...

  4. python编码使用ascii编码_Python中的编码问题:ASCII码 Unicoden编码 UTF-8编码

    编码 字符串是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节 ...

  5. python字符串添加元素_python 中字符串处理

    在python 2或者3 ,字符串编码只有两类 : (1)通用的Unicode编码: (2)将Unicode转化为某种类型的编码,如UTF-8,GBK: 计算机只处理数字,因此处理文本时,必须转换成数 ...

  6. python转换字符编码_Python常见字符编码间的转换

    学习Python,字符编码间的转换是绕不过去的一只拦路虎,不把编码彻底搞明白,总有一天它会猝不及防坑你一把. Python2.x和Python3.x在字符编码的设置上也有很大区别(Python3未来将 ...

  7. python 遍历字符串 字符_python 遍历字符串(含汉字)实例详解

    python 遍历字符串(含汉字)实例详解 python 遍历字符串(含汉字)实例详解 s = "中国china" for j in s: print j 首先一个,你这个'a'是 ...

  8. python英文字符表示_python利用utf-8编码判断中文英文字符(转)

    下面这个小工具包含了判断unicode是否是汉字.数字.英文或者其他字符,全角符号转半角符号,unicode字符串归一化等工作. #!/usr/bin/env python # -*- coding: ...

  9. python转化为字符串格式_Python格式化字符串~转

    在编写程序的过程中,经常需要进行格式化输出,每次用每次查.干脆就在这里整理一下,以便索引. 格式化操作符(%) "%"是Python风格的字符串格式化操作符,非常类似C语言里的pr ...

最新文章

  1. 利用属性封装复杂的选项
  2. AI 框架部署方案之模型部署概述
  3. This Android SDK requires Android Developer Toolkit version 22.6.2 or above.
  4. 记事本输入“联通”俩字,关闭再打开乱码
  5. 建行优盾制单重要还是复核重要_注会成绩复核可行吗?纠结要不要申请!
  6. 【Linux shell】sed实践(2)
  7. 多协程实例讲解(四 Python)
  8. 电脑重装系统后提示invalid partition table怎么解决
  9. display:inline-block的深入理解 转
  10. 使用 Pandas 的 to_excel() 方法来将多个 csv 文件合并到一个 xlsx 的不同 sheets 内
  11. Java并发编程之CyclicBarrier
  12. socketserver模块使用方法
  13. 编写一个Java程序实现多线程,在线程中输出线程的名字,隔300毫秒输出一次,共输出20次。
  14. 五十、Nginx负载均衡、SSL原理、生成SSL密钥对、Nginx配置SSL
  15. 杀毒行业暴利?8条杀毒行业之我见
  16. 自然语言处理:简单解释
  17. 树莓派4B引脚定义及运行实例
  18. 同文输入法 android,同文输入法
  19. LidarSLAM(三):EVO- SLAM轨迹精度评价工具
  20. 信创好难?ARM应用移植避坑指南请收好

热门文章

  1. 如何调试Android Framework?
  2. Page.ClientScript.RegisterStartupScript函数的使用
  3. java_软件发布版本_Asynch HttpClien 对比发行版本说明_Alpha、Beta、RC、GA版本的区别...
  4. Cortex-M0微处理器之错误定位
  5. 姚文详(Joseph Yiu):《ARM Cortex-M0权威指南》中文版目录
  6. 常说SCI论文有多少篇,那你知道SCI是什么吗?
  7. 系统学习机器学习之算法评估
  8. ConcurrentHashMap介绍
  9. JSP Cookie处理
  10. JDBC中的Statement 和PreparedStatement的区别?