2009-05-26 46 views
7

我必須將VB6應用程序的字符串輸出的編碼轉換爲特定的編碼。如何以編程方式確定Windows的當前默認代碼頁?

的問題是,不知道該字符串的編碼,因爲這一點:訪問某些API函數時

按照VB6文檔內部Unicode字符串被轉換爲使用ANSI字符串Windows的默認代碼頁

因此,字符串輸出的編碼在不同系統上可能不同,但我必須知道它執行轉換。

如何使用Win32 API讀取默認代碼頁或者 - 如果沒有其他方法 - 通過閱讀註冊表?

回答

14

通過使用GetACP - 用於返回默認代碼頁的Win32 API調用,它可能更加簡潔! (默認代碼頁通常被稱爲 「ANSI」)

int nCodePage = GetACP(); 

而且許多API調用(如MultiByteToWideChar)接受恆定值CP_ACP(零)總是means "use the system code page"。所以你可能並不需要知道當前的代碼頁,這取決於你想用它做什麼。

1

GetSystemDefaultLCID()爲您提供系統區域設置。

如果LCID是不夠的,你真正需要的代碼頁,使用此代碼:

TCHAR szCodePage[10]; 
    int cch= GetLocaleInfo(
    GetSystemDefaultLCID(), // or any LCID you may be interested in 
    LOCALE_IDEFAULTANSICODEPAGE, 
    szCodePage, 
    countof(szCodePage)); 

    nCodePage= cch>0 ? _ttoi(szCodePage) : 0; 
+0

或者更簡潔一些,如我的回答:`int nCodePage = GetACP();`:)獲取代碼頁的名稱然後獲取代碼頁作爲字符串然後轉換爲整數 – MarkJ 2012-08-15 11:50:40

+0

確實_more succinctly_ :-D – 2012-08-15 13:43:33

0

這爲我工作,謝謝,但可以更簡潔地寫爲:

UINT nCodePage = CP_ACP; 
const int cch = ::GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, 
    LOCALE_RETURN_NUMBER|LOCALE_IDEFAULTANSICODEPAGE, 
    (LPTSTR)&nCodePage, sizeof(nCodePage)/sizeof(_TCHAR)); 
+0

或者更簡潔,如我的答案:`int nCodePage = GetACP();`:)獲取代碼頁的* name *有點冗長,然後查找來自名稱 – MarkJ 2012-05-08 11:42:05

相關問題