【问题标题】:How can I programmatically determine the current default codepage of Windows?如何以编程方式确定 Windows 的当前默认代码页?
【发布时间】:2009-05-26 10:06:07
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: winapi character-encoding


    【解决方案1】:

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

    int nCodePage = GetACP(); 
    

    还有许多 API 调用(例如 MultiByteToWideChar)接受常量值 CP_ACP(零),始终为 means "use the system code page"。因此,您实际上可能不需要知道当前的代码页,这取决于您想用它做什么。

    【讨论】:

    • 感谢建议编辑提及“ANSI”并稍微改进代码格式的人。好主意,我自己做了相应的编辑。
    • ANSI 的这种用法是非常荒谬的。 Windows 代码页通常被称为 ANSI 代码页,因为它们旨在成为标准;但他们从来没有这样做过。使用 then 'ANSI' 来仅引用默认值是非常令人困惑的,我从未见过这样使用它。
    【解决方案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(); :) 获取代码页的名称,然后将代码页作为字符串获取,然后转换为整数是相当冗长的
    【解决方案3】:

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

    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 然后查找标识符有点冗长名称中的代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多