在我的应用程序中,我必须查询系统和用户区域设置并将它们作为字符串返回(例如en-US而不是语言代码)。我可以从GetSystemDefaultLCID()和GetUserDefaultLCID()函数中获取这些语言的LCID,但我正在努力的是从LCID到语言字符串的转换。
我的应用程序也必须在Windows XP上运行,所以我不能使用LCIDToLocaleName()Win API。到目前为止我唯一能够获取语言环境名称的方法是使用GetLocaleInfo()Win API,方法是将LOCALE_SYSTEM_DEFAULT和LOCALE_USER_DEFAULT作为LCID和LOCALE_SISO639LANGNAME传递为LCType。我的代码看起来像查询系统区域设置
int localeBufferSize = GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SISO639LANGNAME, NULL, 0);
char *sysLocale = new char[localeBufferSize];
GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SISO639LANGNAME, sysLocale,localeBufferSize);
但我得到的价值只是语言名称(仅限en-US)。要获得完整的语言环境,我必须两次调用GetLocaleInfo()将LOCALE_SISO3166CTRYNAME作为LCType传递,然后附加两个值。有没有更好的方法呢?
答案 0 :(得分:10)
很抱歉这么说,但没有。只有两个(或更多)字母代码是标准化的,它们的串联不是。但!不需要动态缓冲区分配。引用自MSDN:
此字符串允许的最大字符数为9, 包括终止空字符。
读到这一点,动态分配所需的缓冲区听起来有点过头了,所以如果你真的想要保持它的清洁,你可以这样做:
char buf[19];
int ccBuf = GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SISO639LANGNAME, buf, 9);
buf[ccBuf++] = '-';
ccBuf += GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SISO3166CTRYNAME, buf+ccBuf, 9);