Изменения сортировки NLS

Затронутые платформы

Клиенты — Windows XP, Windows Vista, Windows 7
Серверы — Windows Server 2003, Windows Server 2008, Windows Server 2008 R2

Влияние на функции

Уровень серьезности — высокий
Частота — низкая (несколько затронутых приложений, но если это произошло, всегда не работает)

Описание

Функции поддержки национальных языков (NLS) помогают приложениям поддерживать различные языковые и языковые потребности пользователей по всему миру. Новые версии Windows почти всегда включают изменения NLS. Это изменение влияет на параметры сортировки и, следовательно, на приложения с постоянными индексами.

Таблица параметров сортировки содержит два числа, определяющие ее версию (редакцию): определенную версию и версию NLS. Обе версии являются значениями DWORD, состоящими из основной и дополнительной версии. Первый байт значения зарезервирован, следующие два байта представляют основную версию, а последний байт представляет дополнительную версию. В шестнадцатеричных терминах шаблоном является 0xRRMMMMmm, где R равно Зарезервировано, M — основной, а m — младший. Например, основная версия 3 с дополнительной версией 4 представлена в виде 0x304.

Для основной версии одна или несколько кодовых точек изменяются, поэтому приложение должно переиндексировать все данные, чтобы сравнения были допустимыми. Для дополнительной версии ничего не перемещается, но добавляются кодовые точки. Для этого типа версии приложению требуется переиндексировать только строки с ранее несортируемыми значениями. В целом, вот что означают номера версий в связи с изменениями данных в таблицах исключений, зависящих от языкового стандарта, и в таблицах по умолчанию:

NLSVersion Major — измененные кодовые точки в таблицах исключений или языковых стандартов
NLSVersion Minor — добавлены новые кодовые точки в таблицах исключений или языковых стандартов.
DefinedVersion Major — измененные кодовые точки в таблице по умолчанию
DefinedVersion Minor — добавлены новые кодовые точки в таблицу по умолчанию.

Сортировка номеров версий для выпущенных версий:

Операционная система Выпуск Версия (0xRRMMMMmm)
Windows XP RTM/SP1/SP2/SP3/... Н/Д — api GetNLSVersion() отсутствует
Windows Server 2003 RTM/SP1 0x00 0000 01
Windows Vista RTM/SP1 0x00 0405 00
Windows Server 2008 RTM 0x00 0501 00 / 0x00 5001 00
Windows 7 RTM 0x00060100

 

Проявление

Приложения (например, базы данных) с постоянными индексами, которые не проверка версию NLS и переиндексированы после изменения версии, не смогут правильно сортироваться или могут не предоставить запрошенные результаты.

В случае пользовательских интерфейсов списки (например, алфавитные, числовые, буквенно-цифровые, символы и т. д.) могут сортироваться неправильно.

Решение

Приложение может вызывать getNLSVersionEx (Windows Vista или более поздней версии) или GetNLSVersion (до Windows Vista), чтобы получить определенную версию и версию NLS для таблицы параметров сортировки.

  • GetNLSVersionEx:

Извлекает сведения о текущей версии указанной возможности NLS для языкового стандарта, указанного по имени.
Эта функция позволяет приложению, такому как Active Directory, определить, влияет ли изменение NLS на языковой стандарт, используемый для конкретной таблицы индексов. В противном случае нет необходимости переиндексировать таблицу. Дополнительные сведения см. в разделе Обработка языковых стандартов и языковых сведений.
Эта функция поддерживает пользовательские языковые стандарты. Если lpLocaleName указывает дополнительный языковой стандарт, полученные данные являются правильными данными для порядка сортировки, связанного с этим дополнительным языковым стандартом.

Примечание: Версии Windows до Windows Vista не поддерживают GetNLSVersionEx.

  • GetNLSVersion (используется для приложений, работающих в версиях Windows до Windows Vista):

Извлекает сведения о текущей версии указанной возможности NLS для языкового стандарта, указанного идентификатором.
Эта функция позволяет приложению, такому как Active Directory, определить, влияет ли изменение NLS на идентификатор языкового стандарта, используемый для конкретной таблицы индексов. В противном случае нет необходимости переиндексировать таблицу. Дополнительные сведения см. в разделе Обработка языковых стандартов и языковых сведений.
Примечание: Эта функция извлекает сведения только о языковом стандарте, заданном идентификатором. Функция GetNLSVersionEx поддерживает дополнительные языковые стандарты, функции и имена RFC 4646. Однако версии Windows, предшествующие Windows Vista, не поддерживают GetNLSVersionEx.
Приложения, предназначенные для запуска только в Windows Vista и более поздних версий, должны использовать GetNLSVersionEx в приоритете этой функции. GetNLSVersionEx обеспечивает хорошую поддержку дополнительных языковых стандартов.

Тест совместимости

Действия, чтобы определить, изменилась ли версия параметров сортировки (то есть необходимо переиндексировать):

  • Используйте GetNLSVersionEx(), чтобы получить структуру NLSVERSIONINFOEX при выполнении исходного индексирования данных.

  • Сохраните следующие свойства в индексе, чтобы определить версию: NLSVERSIONINFOEX.dwNLSVersion и NLSVERSIONINFOEX.dwDefinedVersion — эти два свойства вместе определяют версию используемой таблицы сортировки.
    NLSVERSIONINFOEX.dwEffectiveId — указывает действующий языковой стандарт вашего типа. Пользовательский языковой стандарт будет указывать на сортировку встроенного языкового стандарта.

  • При использовании индекса используйте GetNlsVersionEx() для обнаружения версии данных.

  • Если какое-либо из трех свойств изменилось, данные сортировки, которые вы используете, могут возвращать разные результаты, а все индексы могут не найти записи.

  • Если вы знаете, что данные не содержат недопустимых кодовых точек Юникода (т. е. все строки возвращали значение TRUE при вызове IsNLSDefinedString()), вы можете считать их одинаковыми, если изменились ТОЛЬКО низкие байты dwNLSVersion и dwDefinedVersion (дополнительные версии, описанные выше).