我必須將VB6應用程序的字符串輸出的編碼轉換爲特定的編碼。如何以編程方式確定Windows的當前默認代碼頁?
的問題是,不知道該字符串的編碼,因爲這一點:訪問某些API函數時
按照VB6文檔內部Unicode字符串被轉換爲使用ANSI字符串Windows的默認代碼頁。
因此,字符串輸出的編碼在不同系統上可能不同,但我必須知道它執行轉換。
如何使用Win32 API讀取默認代碼頁或者 - 如果沒有其他方法 - 通過閱讀註冊表?
我必須將VB6應用程序的字符串輸出的編碼轉換爲特定的編碼。如何以編程方式確定Windows的當前默認代碼頁?
的問題是,不知道該字符串的編碼,因爲這一點:訪問某些API函數時
按照VB6文檔內部Unicode字符串被轉換爲使用ANSI字符串Windows的默認代碼頁。
因此,字符串輸出的編碼在不同系統上可能不同,但我必須知道它執行轉換。
如何使用Win32 API讀取默認代碼頁或者 - 如果沒有其他方法 - 通過閱讀註冊表?
通過使用GetACP - 用於返回默認代碼頁的Win32 API調用,它可能更加簡潔! (默認代碼頁通常被稱爲 「ANSI」)
int nCodePage = GetACP();
而且許多API調用(如MultiByteToWideChar
)接受恆定值CP_ACP
(零)總是means "use the system code page"。所以你可能並不需要知道當前的代碼頁,這取決於你想用它做什麼。
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;
這爲我工作,謝謝,但可以更簡潔地寫爲:
UINT nCodePage = CP_ACP;
const int cch = ::GetLocaleInfo(LOCALE_SYSTEM_DEFAULT,
LOCALE_RETURN_NUMBER|LOCALE_IDEFAULTANSICODEPAGE,
(LPTSTR)&nCodePage, sizeof(nCodePage)/sizeof(_TCHAR));
或者更簡潔,如我的答案:`int nCodePage = GetACP();`:)獲取代碼頁的* name *有點冗長,然後查找來自名稱 – MarkJ 2012-05-08 11:42:05
或者更簡潔一些,如我的回答:`int nCodePage = GetACP();`:)獲取代碼頁的名稱然後獲取代碼頁作爲字符串然後轉換爲整數 – MarkJ 2012-08-15 11:50:40
確實_more succinctly_ :-D – 2012-08-15 13:43:33