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

Winapi 如何以编程方式确定Windows的当前默认代码页?,winapi,character-encoding,Winapi,Character Encoding,我必须将VB6应用程序的字符串输出的编码转换为特定的编码 问题是,我不知道字符串的编码,因为: 根据VB6文档,当访问某些API函数时,内部Unicode字符串将使用Windows的默认代码页转换为ANSI字符串 因此,字符串输出的编码在不同的系统上可能不同,但我必须知道它才能执行转换 如何使用Win32 API读取默认代码页,或者如果没有其他方法,如何读取注册表?提供了系统区域设置 如果LCID不够,并且您确实需要代码页,请使用以下代码: TCHAR szCodePage[10]; i

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

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

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

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

如何使用Win32 API读取默认代码页,或者如果没有其他方法,如何读取注册表?

提供了系统区域设置

如果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) );

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


还有许多API调用(例如)接受常量值
CP\u ACP
(零),该值始终为零。因此,您可能实际上不需要知道当前代码页,这取决于您想对其执行什么操作。

或者更简洁,如我的回答所示:
int nCodePage=GetACP():)获取代码页的名称,然后从名称中查找标识符代码有点冗长,多亏了建议编辑提及“ANSI”并稍微改进代码格式的人。好主意,我自己也做了相应的编辑。ANSI的这种用法很荒谬。Windows代码页通常被称为ANSI代码页,因为它们旨在成为标准;但他们从来没有这样做过。使用“ANSI”只引用默认值是非常容易混淆的,我从来没有见过这样使用它:)获取代码页的名称,然后将代码页作为字符串获取,然后转换为整数,这是一个相当冗长的过程
int nCodePage = GetACP();