C++ 将LCID转换为语言字符串

C++ 将LCID转换为语言字符串,c++,locale,C++,Locale,在我的应用程序中,我必须查询系统和用户区域设置,并将它们作为字符串返回(像en-US而不是语言代码)。我可以从GetSystemDefaultLCID()和GetUserDefaultLCID()函数中获取这些语言的LCID,但我所要解决的是从LCID到语言字符串的转换 我的应用程序也必须在Windows XP上运行,因此我不能使用LCIDToLocaleName()Win API。到目前为止,我唯一能够获得语言环境名称的方法是使用GetLocaleInfo()Win API,将语言环境\系统\

在我的应用程序中,我必须查询系统和用户区域设置,并将它们作为字符串返回(像en-US而不是语言代码)。我可以从GetSystemDefaultLCID()和GetUserDefaultLCID()函数中获取这些语言的LCID,但我所要解决的是从LCID到语言字符串的转换

我的应用程序也必须在Windows XP上运行,因此我不能使用LCIDToLocaleName()Win API。到目前为止,我唯一能够获得语言环境名称的方法是使用GetLocaleInfo()Win API,将语言环境\系统\默认值和语言环境\用户\默认值作为LCID传递,将语言环境\ 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-of-en-US)。要获得完整的语言环境,我必须调用GetLocaleInfo()两次,第二次将locale_SISO3166CTRYNAME作为LCType传递,然后附加这两个值。有更好的方法吗?

很抱歉,没有。只有两个(或更多)字母代码是标准化的,它们的串联不是标准化的。但是不需要动态缓冲区分配。引用自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);

这是一个可接受的选择吗?这是LCIDToLocaleName的前vista版本,但它需要一些额外的安装。不,我认为这是不可接受的。我需要的东西,可以运行在Windows上没有任何额外的安装。我正在寻找这个完全相同的东西。回答得很好。只有一个问题。
ccBuf
也对空终止符进行计数,因此您需要将其中一行更改为
buf[ccBuf-1]='-'