当我做 GetLocaleInfo($0C51, LOCALE_SABBREVLANGNAME, Language, LOCALE_NAME_MAX_LENGTH);
回来了 ZZZ. ZZZ seam是宗喀语(不丹)的无效代码。这是否意味着GetLocaleInfo LOCALE_SABBREVLANGNAME已经过时了?
首先,我可以重现这个问题。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;
}