在我的应用程序中,我必须查询系统和用户区域设置,并将它们作为字符串返回(比如en-US而不是语言代码)。我可以从GetSystemDefaultLCID()和GetUserDefaultLCID()函数中获得这些语言的LCID,但是我正在挣扎的是从LCID到语言字符串的转换。
我的应用程序也必须运行在Windows上,所以我不能使用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传递,然后追加这两个值。有什么更好的方法吗?
发布于 2011-10-13 19:36:07
很抱歉这么说,但不是。只有两个(或更多)字母代码是标准化的,它们的连接不是。但!不需要动态缓冲区分配。引用自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);https://stackoverflow.com/questions/7749999
复制相似问题