Windows区域设置ID(LCID)是否与USB语言ID相同?

时间:2013-03-15 05:51:00

标签: c# winapi usb locale lcid

我正在使用C#开发一个工具,允许用户为USB设备配置USB字符串描述符。字符串描述符之一是语言ID。我希望UI显示语言名称列表而不是隐藏语言ID。我找不到任何可以获得USB {语言ID - 语言名称}地图的API。

当我查看Windows区域设置ID(LCID)时,LCID和usb语言ID似乎是相同的(我比较的几个条目的推断)。

所以,我的问题是

  1. LCID和USB语言ID是否相同?
  2. 如果是(1),是否有使用它的任何陷阱?

2 个答案:

答案 0 :(得分:3)

他们确实密切相关,但它们并不完全相同。

根据the documentation linked by Ankur

  

LanguageID参数指定语言ID(与Microsoft Win32 LANGID值中使用的值相同)。

LANGID值形成Win32 LCID值的部分。您可以通过研究the documentation for LCIDs

来看到这一点
  

每个语言环境都有一个唯一标识符,一个32位值,由一个语言标识符和一个排序顺序标识符组成。

所以这两个值不是完全可以互换的。通过改变排序顺序标识符(LCID值的另一部分),您最终可以得到多个LCID值,这些值都表示相同的语言(即具有相同的LANGID)。

将两者视为等效物可能在大部分时间都有效(这解释了视觉检查的结果),但它也可能会破裂。我建议不要依赖假设并做一些额外的工作,以确保您与文档保持一致,并且您的代码是健壮的。

Win32 SDK标头提供了一些宏来帮助您在LCID和LANGID之间进行转换。您可以在标头中查找这些内容并将它们转换为C#帮助程序函数。你感兴趣的是:

  • MAKELCID macro接受语言标识符(LANGID)和排序顺序标识符,并将它们组合以生成LCID。由于您不关心排序顺序标识符,因此可以使用SORT_DEFAULT来指示该语言的默认排序顺序。

  • LANGIDFROMLCID macro,从LCID值中提取语言标识符(LANGID)。

使用其中一个辅助函数将确保在调用其中一个接受LCID参数的NLS API时获得有效结果。

答案 1 :(得分:1)

我认为他们是一样的。看看这个链接。

http://msdn.microsoft.com/en-us/library/windows/hardware/ff540156(v=vs.85).aspx