首页 > 解决方案 > 在 Windows 上存储语言环境名称的缓冲区大小应该是多少?

问题描述

我想将附加的语言环境名称和代码页存储在缓冲区中,缓冲区的理想大小应该是多少?

来自 winnt.h

// Maximum Locale Name Length in Windows
// Locale names are preferred to the deprecated LCID/LANGID concepts.
//
// Locale names should follow the BCP47 recommendations and typically
// include language, script, regional variant, and perhaps additional specifiers.
// BCP47 allows some variation, eg: en-US is preferred to en-Latn-US.
#define LOCALE_NAME_MAX_LENGTH   85

正如我们所见,LOCALE_NAME_MAX_LENGTH 是没有代码页的区域名称,例如:“en-US”,但我想存储“en-US.1252”、“English_United States.1252”等。

代码页允许的标准最大长度是多少?

其实我想做以下事情。我正在使用 128 个宽字符的数组,我想知道相同的最佳大小是多少?

    size_t      buffer_size;
    wchar_t     wc_locale_name[128];
    wchar_t     buffer[128];
    wchar_t     wc_full_locale_name[128];
    
    buffer_size = _countof(buffer);
    wmemset(wc_locale_name, 0, buffer_size);
    wmemset(buffer, 0, buffer_size);
    wmemset(strbuf, 0, buffer_size);
    
    MultiByteToWideChar(CP_ACP, 0, "en-US", len, wc_locale_name,
                    LOCALE_NAME_MAX_LENGTH);
    if (GetLocaleInfoEx(wc_locale_name, LOCALE_SENGLISHLANGUAGENAME, buffer,
        buffer_size))
    {
        len = swprintf(wc_full_locale_name, buffer_size, L"%ls", buffer);
        wmemset(buffer, 0, buffer_size);
        if (GetLocaleInfoEx(wc_locale_name, LOCALE_SENGLISHCOUNTRYNAME,
            buffer, buffer_size))
        {
            len += swprintf(wc_full_locale_name + len, buffer_size - len, L"_%ls",
                buffer);
            wmemset(buffer, 0, buffer_size);
            if (GetLocaleInfoEx(wc_locale_name, LOCALE_IDEFAULTANSICODEPAGE,
                buffer, buffer_size))
            {
                len = swprintf(wc_full_locale_name + len, buffer_size - len, L".%ls",
                    buffer);
            }
    }
}

标签: c++windowslocalecodepagessetlocale

解决方案


推荐阅读