2011-02-24 57 views
19

我有一個相當大的Python 2.6應用程序,大量的打印語句灑了。我在整個使用Unicode字符串,它通常很好。但是,如果我重定向應用程序(如「myapp.py> output.txt中」)的輸出,那麼我偶爾會出錯,如這樣的:Linux/Python:編碼一個unicode字符串打印

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa1' in position 0: ordinal not in range(128) 

我想,如果有人設置了同樣的問題出現他們的LOCALE到ASCII。現在,我完全理解這個錯誤的原因。我的Unicode字符串中有一些字符不能用ASCII編碼。很公平。但是我希望我的python程序儘可能地嘗試打印可理解的東西,可能會跳過可疑字符或用Unicode標識替換它們。

這個問題一定是常見的......處理這個問題的最佳做法是什麼?我更喜歡一個解決方案,它允許我繼續使用普通的「打印」,但如果需要,我可以修改所有的事件。

PS:我現在已經解決了這個問題。解決方案既不是給出的答案。我使用了在http://wiki.python.org/moin/PrintFails給出的方法,如ChrisJ在其中一個評論中給出的。也就是說,我用一個調用unicode編碼並使用正確參數的包裝器替換sys.stdout。工作得很好。

+0

「ASCII」是一種語言環境? – 2011-02-24 20:23:57

+0

可能的重複[如果命令行程序不確定stdout的編碼,應該輸出什麼編碼?](http://stackoverflow.com/questions/5013599/if-a-command-line-program-is-unsure- of-stdouts-encoding-what-encoding-should-it) – 2011-02-24 20:28:04

+0

以下是可能證明有用的兩個指針:http://wiki.python.org/moin/PrintFails - http://stackoverflow.com/questions/1473577/寫入unicode字符串通過sys-stdout-in-python – ChrisJ 2011-02-24 20:40:20

回答

5

我現在已經解決了這個問題。解決方案既不是給出的答案。我使用了在http://wiki.python.org/moin/PrintFails給出的方法,如ChrisJ在其中一個評論中給出的。也就是說,我用一個調用unicode編碼並使用正確參數的包裝器替換sys.stdout。工作得很好。

+1

我沒有看到任何評論給出的頁面。你能在這裏重現你的解決方案嗎? – 2017-03-21 14:09:21

18

如果您正在轉儲到ASCII終端,請使用unicode.encode手動編碼,並指定應忽略錯誤。

u = u'\xa0' 
u.encode('ascii') # This fails 
u.encode('ascii', 'ignore') # This replaces failed encoding attempts with empty string 

如果你想存儲Unicode文件,試試這個:

u = u'\xa0' 
print >>open('out', 'w'), u # This fails 
print >>open('out', 'w'), u.encode('utf-8') # This is ok 
2

自動換行所有的print語句通過一個方法來執行任意的Unicode - > UTF8轉換或作爲最後手段改變Python的默認編碼從ascii到utf-8在你的site.py中。一般來說,打印未過濾到sys.stdout的unicode字符串是一個糟糕的主意,因爲Python會觸發unicode字符串向ascii配置的默認編碼的隱式轉換。