python 输出字符串编码_Python print 字符串编码问题
又一次, 被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 字符串编码问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python画饼状图的包_Python数
- 下一篇: mysqlsql varchar类型只取