2013-03-15 38 views
6

我正在开发一个C#工具,它允许用户配置USB设备的USB字符串描述符。其中一个字符串描述符是语言ID。我希望UI显示语言名称列表,而不是隐含的语言ID。我无法找到任何可以获得USB {语言ID - 语言名称}地图的API。Windows区域设置ID(LCID)是否与USB语言ID相同?

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

所以,我的问题是

  1. 是LCID和USB语言ID一样吗?
  2. 如果对(1)是,是否有使用它的缺陷?

回答

1

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

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

+0

借调。 [USB LANGIDs](http://www.usb.org/developers/docs/USB_LANGIDs.pdf)似乎与[Microsoft指定的区域设置ID]配对(http://msdn.microsoft.com/en-us/ goglobal/bb964664.aspx)。 – 2013-03-15 06:07:03

+1

他们似乎*配对,但实际的关系比这更复杂一点。如果你依赖它们是相同的,你的代码将在大多数情况下工作,但在某些情况下可能会失败。查看我的答案了解更多详情。 (cc @PeterHuene) – 2013-03-15 09:00:27

3

他们的确是密切相关,但它们并不完全一样。

根据the documentation linked by Ankur

LanguageID参数指定的语言ID(相同的值被用作在微软的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之一。

相关问题