我使用的是2.7編寫的Python腳本(seafile-cli來自Seafile,這是文件同步解決方案)。我知道unicode在Python 2中是有問題的,但值得慶幸的是,在啟動腳本時正確處理了帶有變音符號的文件名:$ # seaf-cli status# Name Status Progressphotos downloading 0/0, 0.0KB/sMa bibliothèque downloading 566/1770, 1745.7KB/svideos downloading 28/1203, 5088.0KB/sdev-perso downloading 0/0, 0.0KB/sdev-pro downloading 0/0, 0.0KB/s令我驚訝的是,在傳遞此輸出時,Python腳本崩潰UnicodeEncodeError:$ seaf-cli status | cat -# Name Status Progressphotos downloading 0/0, 0.0KB/sTraceback (most recent call last): File "/usr/bin/seaf-cli", line 845, in <module> main() File "/usr/bin/seaf-cli", line 841, in main args.func(args) File "/usr/bin/seaf-cli", line 649, in seaf_status tx_task.rate/1024.0)UnicodeEncodeError: 'ascii' codec can't encode character u'\xe8' in position 11: ordinal not in range(128)雖然我知道它Ma bibliothèque最初可能有問題(但沒有),但為什么管道傳輸會觸發回溯?那不是外殼的問題嗎?-此時輸出已“離開”腳本。
1 回答

互換的青春
TA貢獻1797條經驗 獲得超6個贊
Python知道如何處理程序內部的編碼,因為它使用了終端應用程序正在使用的任何編碼。
當你發送(管道)的輸出出來,它需要被編碼。這是因為使用管道實際上在應用程序之間發送字節流。每個管道都是單向通道,一側寫入數據,另一側讀取數據。
使用管道或重定向,您正在將數據發送到fd,該數據由另一個應用程序讀取。
因此,您需要確保Python在將數據發送出去之前正確地對數據進行編碼,然后輸入程序需要在處理之前對其進行解碼。
您可能還會發現此問題有用
更新:我將嘗試詳細說明編碼。我的答案的第一行是什么意思,因為您的Python解釋器使用特定的編碼,所以它知道如何將六進制值(實際字節)轉換為符號。
我的翻譯沒有;如果我嘗試從您的文本創建字符串-我收到錯誤消息:
>>> s = 'bibliothèque'
Unsupported characters in input
這是因為我在解釋器上使用了不同的編碼。
您的外殼使用與Python解釋器不同的編碼。當Python從程序中發送數據時,它使用默認編碼:ASCII。它無法使用ASCII轉換您的特殊字符(由十六進制值\ xe8顯示)。因此,您必須指定要使用的編碼,以便Python發送。
添加回答
舉報
0/150
提交
取消