Microsoft Windows提供了幾種查詢當前代碼頁的功能: GetACP
,GetConsoleOutputCP
,GetConsoleCP
。爲什麼ANSI代碼頁和控制檯代碼頁是不同的?
它們返回不同的值。例如,我的機器上,GetACP
回報1252,而GetConsoleOutputCP
和GetConsoleCP
返回437
(我們也可以運行在命令行上chcp
並獲得437)
- 爲什麼Windows提供不同的代碼頁控制檯和非控制檯?
- 這些代碼頁是如何確定每臺機器?
- 同一臺機器上的代碼頁之間的關係是什麼?控制檯和非控制檯代碼頁之間是否存在關聯?具有代碼頁1252的機器是否總是擁有437的控制檯代碼頁?
對這個問題的背景是從Visual Studio C++的錯誤消息:發生
error C2855: command-line option '/source-charset' inconsistent with precompiled header
error C2855: command-line option '/execution-charset' inconsistent with precompiled header
這些錯誤時,預編譯的頭文件是用不同的默認代碼頁比是CPP文件建使用它們(出於任何原因)。
從MSDN docs:
如果沒有發現字節順序標記時,它假定源文件使用當前用戶代碼頁編碼 ,除非你指定一個字符通過設置 名稱或代碼頁/ source-charset選項。
所以我想弄清楚他們是指,由GetACP
或其他返回的其中一個代碼頁...
對於下流者來說,如果你沒有解釋就冷靜下來,那就是你的特權。但至少給出一點反饋讓我知道什麼是錯的更有幫助;如果我有改進答案的方法,或者您的理由足夠重要,我應該刪除此答案。 – eryksun
downvoter可能是拖釣。沒有解釋,這個問題也被低估了。現在你提到的最後一件事讓我感到困惑。除了ANSI和OEM之外,我們還有其他代碼頁嗎?根據[此MSDN頁面](https://msdn.microsoft.com/en-us/library/windows/desktop/dd373761(v = vs.85).aspx)'LOCALE_IDEFAULTANSICODEPAGE'返回ANSI代碼頁和'LOCALE_IDEFAULTCODEPAGE '返回OEM代碼頁。它們與'GetACP','GetConsoleCP'等返回的代碼頁有什麼不同? –
大多數Windows語言環境都定義了ANSI和OEM代碼頁。用戶的區域設置不一定與系統區域設置相同。您可以使用控制面板中的區域應用更改用戶區域設置(即「格式」)。 'GetLocaleInfoEx'將在爲'LOCALE_IDEFAULTANSICODEPAGE'和'LOCALE_IDEFAULTCODEPAGE'(OEM)返回的值中動態地反映。但是,更改系統區域設置(區域 - >管理)需要重新啓動以查看'GetACP()'和'GetOEMCP()'中反映的更改。 – eryksun