如何通过编程确定Windows的当前默认代码页?

13

我需要将VB6应用程序的字符串输出转换为特定编码,但我不知道该字符串的编码。

问题在于,由于某些API函数的内部Unicode字符串会使用Windows的默认代码页转换为ANSI字符串,因此字符串输出的编码可能因系统而异,但我必须了解它才能执行转换。

我如何使用Win32 API或(如果没有其他方法)读取注册表来查找默认代码页?

3个回答

22

通过使用GetACP,可以更加简洁地返回默认代码页!(默认代码页通常称为“ANSI”)

int nCodePage = GetACP(); 

同时,许多API调用(例如MultiByteToWideChar)接受常量值CP_ACP(零),它始终表示“使用系统代码页”。因此,根据您希望执行的操作,您实际上可能不需要知道当前代码页。


感谢建议提及“ANSI”并稍微改进代码格式。好主意,我已经自己编辑了它。 - MarkJ
1
这种使用 ANSI 的方式相当荒谬。Windows 代码页通常被称为 ANSI 代码页,因为它们旨在成为标准;然而它们从未实现过。仅将“ANSI”用于默认值是非常令人困惑的,我从未见过它被这样使用。 - MicroVirus

2

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;

更简洁地说,就像我的回答一样:int nCodePage=GetACP(); :) 获取代码页的名称,然后将其作为字符串获取,再转换为整数相当冗长。 - MarkJ

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(); :) 从名称获取代码页的名称,然后查找标识符代码有点冗长。 - MarkJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接