Идентификатор языкового стандарта Windows (LCID) совпадает с идентификатором языка USB?

Я разрабатываю инструмент на C#, который позволяет пользователю настраивать строковые дескрипторы USB для устройства USB. Одним из строковых дескрипторов является идентификатор языка. Я хочу, чтобы пользовательский интерфейс отображал список названий языков вместо загадочных идентификаторов языков. Я не смог найти API, который бы дал мне карту USB {language ID - Language name}.

Когда я посмотрел на идентификатор языкового стандарта Windows (LCID), идентификаторы языка LCID и usb, похоже, совпадали (вывод из нескольких сравненных записей).

Итак, мои вопросы

  1. Являются ли идентификаторы языка LCID и USB одинаковыми?
  2. Если да (1), есть ли подводные камни в его использовании?

2 ответа

Они действительно тесно связаны, но они не совсем одинаковы.

Согласно документации, на которую ссылается Анкур:

LanguageID параметр указывает идентификатор языка (используются те же значения, что и в Microsoft Win32 LANGID ценности).

Значение LANGID является частью значения Win32 LCID. Вы можете увидеть это, изучив документацию по LCID:

Каждая локаль имеет уникальный идентификатор, 32-битное значение, которое состоит из идентификатора языка и идентификатора порядка сортировки.

Таким образом, эти два значения не являются полностью взаимозаменяемыми. Изменяя идентификатор порядка сортировки (другую часть значения LCID), вы можете получить несколько значений LCID, которые представляют один и тот же язык (т. Е. Имеют один и тот же LANGID).

Отношение к двум из них как к эквивалентным может работать большую часть времени (что объясняет результаты вашего визуального осмотра), но также может привести к поломке. Я бы посоветовал не полагаться на предположения и выполнять дополнительную работу, необходимую для обеспечения соответствия документации и надежности кода.

Заголовки Win32 SDK предоставляют несколько макросов, чтобы помочь вам взаимно конвертировать между идентификаторами LCID и LANGID. Вы можете найти их в заголовках и преобразовать их в вспомогательные функции C#. Те, которые вас интересуют здесь:

  • MAKELCID макрос принимает идентификатор языка (LANGID) и идентификатор порядка сортировки и объединяет их для генерации LCID. Так как вам не нужен идентификатор порядка сортировки, вы можете использовать SORT_DEFAULT для этого, чтобы указать порядок сортировки по умолчанию для этого языка.

  • LANGIDFROMLCID макрос, который извлекает идентификатор языка (LANGID) из значения LCID.

Использование одной из этих вспомогательных функций гарантирует, что вы получите действительные результаты при вызове одного из API-интерфейсов NLS, которые принимают параметр LCID.

Я думаю, что они одинаковы. Посмотрите на эту ссылку.

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

Другие вопросы по тегам