2010-10-25 56 views
22

在Python中,什麼編碼是sys.argv的元素?他們是用sys.getdefaultencoding()編碼編碼的嗎?Python:哪個編碼用於處理sys.argv?

sys.getdefaultencoding():返回Unicode實現使用的當前默認字符串編碼的名稱。

PS:由於在一些問題的答案中指出,sys.stdin.encoding的確會是一個更好的猜測。我很想看到這個問題的明確答案,但是,指向可靠的消息來源!如Wim指出的,Python 3通過將str對象放在sys.argv中(如果我理解正確的話)解決了這個問題。但是,Python 2.x仍然是個問題。在Unix下,LC_CTYPE環境變量似乎是正確的檢查,不是嗎? Windows應該做些什麼(這樣sys.argv元素可以正確解釋任何控制檯)?

回答

3

「Windows應該做些什麼(因此sys.argv元素可以正確解釋控制檯的任何內容)?」

對於Python 2.x,請參閱this comment on issue2128。 (注意沒有編碼對於原始sys.argv是正確的,因爲某些字符可能已經以沒有足夠信息撤銷的方式被破壞;例如,如果ANSI代碼頁不能表示希臘字母,那麼它將被修改爲'a')。

+0

標記爲已接受:對第2128期的這一新評論是新信息!謝謝! – EOL 2011-01-10 09:00:25

4

在Unix系統上,它應該在用戶的語言環境中,(奇怪的是)不會綁定到sys.getdefaultencoding。請參閱http://docs.python.org/library/locale.html

在Windows中,它將位於系統ANSI代碼頁中。

(順便說一句,那些小學教師誰告訴你不結束與介詞在騙你的句子。)

+0

搖搖晃晃的介詞是我不會放的東西。對搖晃的介詞的所謂狹窄顯然是從對風格的觀察演變而來的。換句話說,一個句子的第一個和最後一個單詞是那些具有最自然影響的單詞。因此,僅僅把介詞置於這樣一個戰略重要的位置,就被認爲是文體上的弱點。 – 2010-11-05 21:16:30

+0

@Jim:風格一切都很好,但有些人似乎有這個愚蠢的概念,它不合語法,導致這樣的愚蠢作爲這個問題的標題。 – 2010-11-05 21:28:44

+0

這個問題的標題似乎很清楚,儘管我可能會建議使用* which而不是「what」。更精確的措辭可能是:「哪個編碼用於處理sys.argv?」在保留一些簡單的ASCII字符串處理的同時,所有這些試圖容納國際字符集的嘗試都使文本編碼的整個問題變得相當複雜。圍繞整個事件的術語變得同樣令人費解。 – 2010-11-06 12:13:19

5

我不知道如果這有助於與否,但是這是我得到的在DOS模式下:

C:\Python27>python Lib\codingtest.py нер 
['Lib\\codingtest.py', '\xed\xe5\xf0'] 

C:\Python27>python Lib\codingtest.py hello 
['Lib\\codingtest.py', 'hello'] 

在IDLE:

>>> print "hello" 
hello 
>>> "hello" 
'hello' 
>>> "привет" 
'\xef\xf0\xe8\xe2\xe5\xf2' 
>>> print "привет" 
привет 
>>> sys.getdefaultencoding() 
'ascii' 
>>> 

我們可以從這個推斷出什麼?我還不知道......我會稍微評論一下。

一點點後sys.argv進行編碼sys.stdin.encoding,而不是sys.getdefaultencoding()

+0

\ xef是SMALL LETTER PE('п')的UNICODE CP1251西里爾語表示,因此我開始相信'sys.argv'編碼有'sys.stin.encoding'而不是'sys.getdefaultencoding() ' – soulseekah 2010-10-25 08:02:39

4

幾個意見:

(1)這當然不是sys.getdefaultencoding

(2)sys.stdin.encoding似乎是一個更好的選擇。 (3)在Windows上,sys.stdin.encoding的實際值會有所不同,具體取決於軟件提供的stdio。 IDLE將使用系統「ANSI」代碼頁,例如在西歐和美國的大部分地區以及前殖民地都有。但是,在模擬MS-DOS的命令提示符窗口中,默認情況下會使用相應的舊DOS代碼頁(例如cp850)。這可以通過使用CHCP(更改代碼頁)命令進行更改。

(4)子流程​​模塊的文檔沒有提供關於args和stdout使用什麼編碼的建議。

(5)一個人相信assert sys.stdin.encoding == sys.stdout.encoding永遠不會失敗。

+0

觀察結果似乎是正確的,我也觀察到了相同的結果。你知道sys.getdefaultencoding究竟返回什麼嗎? – 2010-10-25 09:55:34

+0

「它返回Unicode實現使用的當前默認字符串編碼的名稱。」我認爲這意味着Python在其控制檯中使用了defaultencoding()。您可以通過預先設置u''來覆蓋defaultencoding()。很好的答案+1 – soulseekah 2010-10-25 11:38:33

+4

我同意(2) - 我後來想到了。 (5)實際上並非如此:在Unix下,'python test.py> test.txt'例如可以使用UTF-8作爲stdin編碼,而使用None作爲stdout編碼。 – EOL 2010-10-25 15:32:46

7

我猜你是問這個,因爲你碰到issue 2128。請注意,這已在Python 3.0中修復。

+0

謝謝,我會檢查鏈接。在寫一個從命令行接收用戶消息的程序之前,我實際上是在預防性地提出這個問題。 – EOL 2010-11-03 21:35:05

+0

Python 2.x呢?和Windows? – EOL 2010-11-09 15:46:58

0

sys.getfilesystemencoding()適用於我,至少在Windows上。 在Windows上它實際上是'mbcs',而* nix上是'utf-8'。