簡體   English   中英

Windows控制台編碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM