[英]Windows console encoding
Windows上默認的控制台編碼是什么? 似乎有時是chcp
命令給定的ANSI編碼 ( CP-1252 ),有時是OEM編碼 (默認是西歐的CP-850 )。
命令行參數和環境變量觸發ANSI編碼( é
= 0xe9):
> chcp 850 Active code page: 850 > python -c "print 'é'" Ú > python -c "print '\\x82'" é > python -c "print '\\xe9'" Ú > $env:foobar="é"; python -c "import os; print os.getenv('foobar')" Ú > chcp 1252 Active code page: 1252 > python -c "print 'é'" é > python -c "print '\\x82'" , > python -c "print '\\xe9'" é > $env:foobar="é"; python -c "import os; print os.getenv('foobar')" é
蟒控制台和標准輸入觸發OEM編碼( é
=為0x82如果OEM編碼是CP-850, é
= 0xe9如果OEM編碼是CP-1252):
> chcp 850 Active code page: 850 > python >>> print 'é' é >>> print '\\x82' é >>> print '\\xe9' Ú > python -c "print raw_input()" é é > chcp 1252 Active code page: 1252 > python >>> print 'é' é >>> print '\\x82' , >>> print '\\xe9' é > python -c "print raw_input()" é é
注意。 –在這些示例中,我在Windows 10上使用了Powershell 5.1和CPython 2.7.14。
首先,對於所有非ASCII字符,重要的是控制台編碼和Windows區域設置,您使用的是字節字符串,而Python只是打印出接收到的字節。 在將鍵盤輸入傳遞給Python之前,控制台會將您的鍵盤輸入編碼為特定的字節或字節序列。 對於Python,這都是不透明的數據(數字范圍為0-255),並且print
將這些數據以Python接收它們的方式傳遞回控制台。
在Powershell中,通過命令行開關發送到Python的字節所使用的編碼方式不是由chcp
代碼頁確定,而是由控制面板中的“ 非Unicode程序的語言”設置確定(搜索Region ,然后找到Administrative標簽) )。 此設置將é
編碼為0xE9,然后將其作為命令行參數傳遞給Python。 有許多Windows代碼頁將0xE9用於é
(但沒有ANSI編碼之類的東西 )。
環境變量也是如此。 Python將Windows用作MBCS編解碼器的編碼 ; 您可以使用'mbcs'
編解碼器將命令行參數或環境變量解碼為Unicode,該編解碼器使用帶有CP_ACP
標志的MultiByteToWideChar()
和WideCharToMultiByte()
Windows API函數。
使用交互式提示時,Python傳遞的字節由Powershell控制台語言環境代碼頁(由chcp
設置)編碼。 對於您來說,這是850頁的代碼,當您輸入é
時,會收到一個十六進制值為0x82的字節。 因為print
將相同的0x82字節發送回同一控制台,所以控制台隨后將0x82轉換回屏幕上的é
字符。
只有當您使用Unicode文本 (如u'é'
這樣的unicode字符串文字)時,Python才會對數據進行任何解碼和編碼。 print
寫入sys.stdout
,后者被配置為將Unicode數據編碼為當前語言環境(或設置為PYTHONIOENCODING
),因此print u'é'
會將Unicode對象寫入sys.stdout
,然后使用sys.stdout
將對象編碼為字節配置的編解碼器,然后將這些字節寫入控制台。
為了從u'é'
源代碼文本(本身就是字節序列)生成unicode
對象,Python確實必須解碼給定的源代碼。 對於-c
命令行,傳入的字節被解碼為Latin-1 。 在交互式控制台中,使用區域設置。 因此,在交互式會話中, python -c "print u'é'"
和print u'é'
將導致不同的輸出。
應當指出,Python 3始終使用Unicode字符串,並且命令行參數和環境變量通過Windows的“寬” API加載到Python中以UTF-16的形式訪問數據,然后以Unicode字符串對象的形式呈現。 您仍然可以以字節字符串的形式訪問控制台數據和文件系統信息,但是從Python 3.6開始, 以二進制格式訪問文件系統和stdin / stdout / stderr流使用UTF-8編碼的數據 (再次使用“寬” API)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.