如何以编程方式确定Windows的当前默认代码页?

时间:2009-05-26 10:06:08

标签: winapi character-encoding

我必须将VB6应用程序的字符串输出的编码转换为特定的编码。

问题是,我不知道字符串的编码,因为:

  

根据VB6文档,在访问某些API函数时,使用Windows的默认代码页将内部Unicode字符串转换为ANSI字符串。

因此,字符串输出的编码在不同的系统上可能会有所不同,但我必须知道它才能执行转换。

如何使用Win32 API读取默认代码页,或者 - 如果没有其他办法 - 通过阅读注册表来阅读?

3 个答案:

答案 0 :(得分:14)

使用GetACP - Win32 API调用返回默认代码页可能更简洁! (默认代码页通常称为“ANSI”)

int nCodePage = GetACP(); 

许多API调用(例如MultiByteToWideChar)也会接受始终为means "use the system code page"的常量值CP_ACP(零)。因此,您可能实际上不需要知道当前的代码页,具体取决于您要对其执行的操作。

答案 1 :(得分: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;

答案 2 :(得分:0)

这对我有用,谢谢,但可以更简洁地写成:

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