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

Pal*_*din 6 c# usb winapi locale lcid

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

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

所以,我的问题是

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

Cod*_*ray 5

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

根据Ankur 链接的文档

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

LANGID 值构成Win32 LCID 值的一部分。您可以通过研究LCID 的文档来了解这一点:

每个区域设置都有一个唯一的标识符,即一个由语言标识符和排序顺序标识符组成的 32 位值。

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

将两者视为等效可能在大多数情况下有效(这解释了目视检查的结果),但也可能会失败。我建议不要依赖假设并做一些必要的额外工作,以确保您与文档保持一致并且您的代码是健壮的。

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

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

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

使用这些辅助函数之一将确保您在调用接受 LCID 参数的 NLS API 之一时获得有效结果。