带有LOCALE_SABBREVLANGNAME的GetLocaleInfo是否已经过时?

问题描述 投票:1回答:1

当我做 GetLocaleInfo($0C51, LOCALE_SABBREVLANGNAME, Language, LOCALE_NAME_MAX_LENGTH); 回来了 ZZZ. ZZZ seam是宗喀语(不丹)的无效代码。这是否意味着GetLocaleInfo LOCALE_SABBREVLANGNAME已经过时了?

windows winapi localization locale globalization
1个回答
1
投票

首先,我可以重现这个问题。GetLocaleInfo 返回4,语言是 L"ZZZ".

然后,由于文档 GetLocaleInfo 说。

出于互操作性的原因,应用程序应优先考虑的是 GetLocaleInfoEx 功能,以 GetLocaleInfo 因为微软正在向使用locale名称而不是新的locale标识符的方向迁移。任何只在Windows Vista和更高版本上运行的应用程序都应该使用 GetLocaleInfoEx.

正如@Eryk所指出的那样,这也是在 WinNls.h:

#define LOCALE_SABBREVLANGNAME        0x00000003   // DEPRECATED arbitrary abbreviated language name, LOCALE_SISO639LANGNAME instead.

此外,ISO 639-1和ISO 639-2。

#define LOCALE_SISO639LANGNAME        0x00000059   // ISO abbreviated language name, eg "en"
...
#define LOCALE_SISO639LANGNAME2       0x00000067   // 3 character ISO abbreviated language name, eg "eng"

如果你想得到一个 "3个字符的ISO缩写语言名称",样本:

#include <windows.h>
#include <iostream>
using namespace std;
int main() {
    int ret = 0;
    //wchar_t name[LOCALE_NAME_MAX_LENGTH] = { 0 };
    //LCID LocaleID = 0x0c51;
    //ret = LCIDToLocaleName(LocaleID, name, LOCALE_NAME_MAX_LENGTH, LOCALE_ALLOW_NEUTRAL_NAMES);
    //wprintf(L"%s\n", name);//dz-BT

    wchar_t name[] = L"dz-BT";
    wchar_t Language[LOCALE_NAME_MAX_LENGTH] = { 0 };

    ret = GetLocaleInfoEx(name, LOCALE_SISO639LANGNAME2, Language, LOCALE_NAME_MAX_LENGTH);
    wprintf(L"%s\n", Language);//dzo
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.