Идентификатор языкового стандарта Windows (LCID) совпадает с идентификатором языка USB?
Я разрабатываю инструмент на C#, который позволяет пользователю настраивать строковые дескрипторы USB для устройства USB. Одним из строковых дескрипторов является идентификатор языка. Я хочу, чтобы пользовательский интерфейс отображал список названий языков вместо загадочных идентификаторов языков. Я не смог найти API, который бы дал мне карту USB {language ID - Language name}.
Когда я посмотрел на идентификатор языкового стандарта Windows (LCID), идентификаторы языка LCID и usb, похоже, совпадали (вывод из нескольких сравненных записей).
Итак, мои вопросы
- Являются ли идентификаторы языка LCID и USB одинаковыми?
- Если да (1), есть ли подводные камни в его использовании?
2 ответа
Они действительно тесно связаны, но они не совсем одинаковы.
Согласно документации, на которую ссылается Анкур:
LanguageID
параметр указывает идентификатор языка (используются те же значения, что и в Microsoft Win32LANGID
ценности).
Значение 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