Функция CompareStringEx

Сравнивает две строки символов, используя заданный язык страны (местности).

Синтаксис

int CompareStringEx(      

    LPCWSTR lpLocaleName,
    DWORD dwCmpFlags,
    LPCWSTR lpString1,
    int cchCount1,
    LPCWSTR lpString2,
    int cchCount2,
    LPNLSVERSIONINFO lpVersionInformation,
    LPVOID lpReserved,
    LPARAM lParam
);

 

Параметры

lpLocaleName

[in] Устанавливает язык страны (местности), используемый для сравнения. Этот параметр может быть или указателем на название языка страны, или одним из нижеследующих предопределенных значений. Для получения дополнительной информации о языке страны и названия страны (местности), см. статьи Языки страны (местности).

Значение

Предназначение

LOCALE_NAME_SYSTEM_DEFAULT Язык страны (местности) системы - значение по умолчанию.
LOCALE_NAME_USER_DEFAULT Язык страны (местности) текущего пользователя - значение по умолчанию.
dwCmpFlags

[in] Набор флажков, которые указывают, как функция сравнивает две строки. По умолчанию, эти флажки не устанавливаются. Этот параметр может быть установлен в нуль, чтобы получить поведение по умолчанию, или это может быть любая комбинация нижеследующих значений.

Флажок

Описание

LINGUISTIC_IGNORECASE Регистр игнорируется при поиске, как  лингвистически соответствующий. Раздел статьи Замечания ниже, объясняет, чем этот флажок отличается от NORM_IGNORECASE.
LINGUISTIC_IGNOREDIACRITIC Игнорирует несамостоятельные (без пробелов) символы, как лингвистически соответствующие. Раздел статьи Замечания ниже объясняет, чем этот флажок отличается от NORM_IGNORENONSPACE.
NORM_IGNORECASE Игнорирует регистр. Раздел статьи Замечания ниже объясняет, чем этот флажок отличается от LINGUISTIC_IGNORECASE.
NORM_IGNOREKANATYPE Не делает различий между символами японского языка Hiragana и Katakana. Соответствующие символы Hiragana и Katakana при сравнении считаются как одинаковые.
NORM_IGNORENONSPACE Игнорирует несамостоятельные символы. Раздел статьи Замечания ниже объясняет, чем этот флажок отличается от LINGUISTIC_IGNOREDIACRITIC.
NORM_IGNORESYMBOLS Игнорирует символы.
NORM_IGNOREWIDTH Не делает различий между однобайтовым символом и тем же самым двухбайтовым символом.
NORM_LINGUISTIC_CASING Использует лингвистические правила для регистра, а не правила файловой системы (по умолчанию). Раздел статьи Замечания ниже объясняет это более подробно.
SORT_STRINGSORT Обрабатывает пунктуацию также, как символы.

 

lpString1

[in] Указатель на первую сравниваемую строку.

cchCount1

[in] Определяет число WCHARs в строке, указанной при помощи параметра lpString1. Подсчет не включает в себя символ конца строки ("0"). Если этот параметр - какое-либо отрицательное значение, то предполагается, что строка завершается нулем, а длина вычисляется автоматически.

lpString2

[in] Указатель на вторую строку, которая будет сравниваться.

cchCount2

[in] Указывает число WCHARs в строке, указанной при помощи параметра lpString2. Подсчет не включает в себя символ конца строки ("0"). Если этот параметр - какое-либо отрицательное значение, то предполагается, что строка завершается нулем, а длина вычисляется автоматически.

lpVersionInformation

[in] Зарезервирован. Должен быть NULL.

lpReserved

[in] Зарезервирован. Должен быть NULL.

lParam

[in] Зарезервирован. Должен быть нуль.

Возвращаемое значение

Если функция завершается успешно, возвращаемое значение - одно из нижеследующих именованных значений.

Чтобы поддержать соглашение времени выполнения C при  сравнении строк, значение 2 может быть вычтено из возвращаемого значения отличного от нуля. Тогда значение <0, == 0 и > 0 являются совместимыми с параметрами времени выполнения программы C.

Значение

Предназначение

CSTR_LESS_THAN Строка, указанная при помощи параметра lpString1, по лексической оценке меньше, чем строка указанная при помощи параметра lpString2.
CSTR_EQUAL Строка, указанная при помощи параметра lpString1, по лексической оценке равна строке, указанной при помощи параметра lpString2. Две строки эквивалентны, чтобы сравнить целевые строки, хотя и не обязательно идентичные.
CSTR_GREATER_THAN Строка, указанная при помощи параметра lpString1, по лексической оценке больше, чем строка, указанная при помощи параметра lpString2.
0 Если функция завершается ошибкой, возвращаемое значение - нуль. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError. GetLastError может возвратить один из нижеследующих кодов ошибки:

ERROR_INVALID_FLAGS
ERROR_INVALID_PARAMETER

Замечания

Эквивалентные строки

Обычно, функции CompareStringEx, CompareString, lstrcmp и lstrcmpi оценивают в строке символ за символом. Однако, у многих языков есть многосимвольные элементы, такие как двухсимвольная пара 'CH' в традиционном испанском языке. Функция CompareStringEx используя язык страны (местности) обозначает параметром lpLocaleName идентификаторы многосимвольных элементов, в то время как функции lstrcmp и lstrcmpi, используют язык страны (местности) пользователя.

Другой пример - вьетнамский язык, который содержит много двухсимвольных элементов, таких как допустимый класс прописных букв, стиль заголовка и формы нижнего регистра 'GI', которые являются 'GI', 'Gi', и 'gi' соответственно. Любая из этих форм обрабатывается как единичный элемент сопоставления и, если регистр игнорируется, сравниваются как эквивалентные. Однако, поскольку элемент 'gI' не имеет силы, как единичный элемент, функции CompareString, CompareStringEx, lstrcmp и lstrcmpi обрабатывают 'gI' как два отдельных элемента.

Напротив, функция CompareStringOrdinal, включенная в Windows Vista, выполняет строго двоичное (бинарное) сравнение: исключая вариант выбора не чувствительности к регистру, это опция игнорирует все недвоичные эквивалентности, и (в отличие от CompareString) она проверяет все точки кодирования на равенство, включая и те, которые не дают какой-либо нагрузки в лингвистических схемах сопоставления.

Оценка строк

Как правило, строки сравниваются, используя, что называется методикой "сортировки слова". При сортировке слов, все знаки препинания и другие неалфавитно-цифровые символы, за исключением дефиса и апострофа, приходят прежде какого-либо буквенно-цифрового символа. Дефис и апостроф обрабатываются по-другому, а не как другие небуквенно-цифровые символы по порядку, для того, чтобы гарантировать, что слова такие как "coop" и "co-op" остались вместе внутри отсортированного списка.

Если флажок SORT_STRINGSORT установлен, то строки сравниваются, используя то, что называется методикой "сортировки строк". При сортировке строк дефис и апостроф обрабатываются точно так же, как и любые другие небуквенно-цифровые символы. Они располагаются перед буквенно-цифровыми символами.

Нижеследующая таблица показывает список слов, отсортированных этими способами.

Сортировка слов Сортировка строк Сортировка слов Сортировка строк
billet bill's t-ant t-ant
bills billet tanya t-aria
bill's bills t-aria tanya
cannot can't sued sue's
cant cannot sues sued
can't cant sue's sues
con co-op went we're
coop con were went
co-op coop we're were

Функции lstrcmp и lstrcmpi используют сортировку слов. Функции CompareString, CompareStringEx, LCMapString, FindNLSString, LCMapStringEx и FindNLSStringEx по умолчанию используют сортировку слов, но если их вызывающая программа устанавливает флажок SORT_STRINGSORT, то используется сортировка строк.

Когда используются функции CompareString, lstrcmp и lstrcmpi

Когда сравнение должно следовать за персональными языковыми настройками пользователя, например, когда сортируются по порядку элементы органа управления Одноуровневого просмотрщика (ListView), сделайте одно из нижеследующего:

Когда результаты сравнения должны быть непротиворечивыми независимо от языка страны (местности), например при сравнении извлеченных данных, опираясь на предопределенный список или внутреннее значение, используется CompareStringEx. Любой из нижеследующих вызовов будет соответствовать даже тогда, когда параметр mystr - "INLAP", тогда как чувствительный к языку страны (местности) вызов функции lstrcmpi завершается ошибкой, если текущий язык страны (местности) - вьетнамский язык.

Функция CompareStringEx может возвратить данные из пользовательских языков страны (custom locales). Пользовательские языки страны дают возможность администраторам изменять любые аспекты форматов местного языка, но это не будет изменять поведение операции сравнения.

Выполнение

Функция CompareStringEx оптимизирована так, чтобы выполняться с самой высокой скоростью, когда параметр dwCmpFlags установлен в 0 или со значением NORM_IGNORECASE, а у параметров cchCount1 и  cchCount2 установлены значения -(минус)1, а заданный язык страны (местности) не поддерживает какие-либо лингвистические свертки (типа того, когда в традиционном испанском языке сравнение рассматривает "ch" как единичный символ).

Заметки об особенностях языка

Флажок NORM_IGNORENONSPACE влияет только на языки стран, в которых, диакритические знаки сортируются при повтором проходе основных символов. Все символы в строке сначала сравниваются не принимая во внимание диакритические знаки и (если строки равны) при втором проходе по строкам, выполняется сравнение диакритических знаков. В этом случае, этот флажок заставляет второй проход не выполнять. Для языков, которые сортируют диакритические знаки символов при первом проходе, этот флажок не имеет никакого действия.

Для многих систем письма флажок NORM_IGNORENONSPACE совпадает с действием флажка LINGUISTIC_IGNOREDIACRITIC, а NORM_IGNORECASE совпадает с флажком LINGUISTIC_IGNORECASE. Особенно это правдиво для латинских алфавитов. Однако:

Обычно, для не чувствительного к регистру сравнения, эта функция устанавливает соответствие символов нижнего регистра "i" символам верхнего регистра "I", даже тогда, когда параметр Locale устанавливает турецкий или азербайджанский язык. Флажок NORM_LINGUISTIC_CASING не принимает во внимание это для турецкого или азербайджанского языков. Если этот флажок определяется, в соединении со значением для параметра Locale, который служит признаком турецкого или азербайджанского языка, то ЛАТИНСКАЯ СТРОЧНАЯ БУКВА БЕЗ ТОЧКИ I (U+0131) является формой нижнего регистра ЛАТИНСКОЙ ЗАГЛАВНОЙ БУКВЫ I (U+0049), а ЛАТИНСКАЯ СТРОЧНАЯ БУКВА I (U+0069),  является формой нижнего регистра ЛАТИНСКАЯ ЗАГЛАВНАЯ БУКВА I С ТОЧКОЙ ВЫШЕ (U+0130).

Для набора двухбайтовых символов (DBCS) местных языков флажок NORM_IGNORECASE влияет на все "широкие" (двухбайтовые) символы, а также на "узкие" (однобайтовые) символы. Это включает в себя "широкие" символы греческого языка и кириллицы.

Функция CompareString в ходе сравнения игнорирует арабские кашиды. Таким образом, если две строки идентичны, содержат наличие кашид, функция CompareString возвращает значение 2; то есть строки считаются "равными" в смысле сопоставления, хотя они не обязательно идентичны.

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

 

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

Пример

Пример, показывающий использование этой функции, может быть найден в статье Поддержка национальных языков (NLS): Примеры API основанных на названиях местности.

Смотри также

Обзор Строки, Функции, используемые строками, Информация о пользовательском языке страны (местности), Контроль версий сопоставления,  FoldString, CompareString, CompareStringOrdinal, GetSystemDefaultLocaleName, GetUserDefaultLocaleName, IsNLSDefinedString, LCMapStringEx, FindNLSStringEx, lstrcmp, lstrcmpi

Размещение и совместимость CompareStringEx

Windows NT Vista Да
К Windows XP Нет
л Windows 2000 Professional Нет
и Windows NT Workstation Нет
е Windows Me Нет
н Windows 98 Нет
т Windows 95 Нет
С Windows Server 2003 Нет
е Windows 2000 Server Нет
р Windows NT Server Нет
в
е
р
Используемая библиотека Kernel32.lib
Используемая DLL kernel32.dll
Заголовочный файл
- объявлено в Winnls.h
- включено в Windows.h
Unicode Реализуются как версии Unicode и ANSI.
Замечания по платформе Не имеется

Назад в оглавление
На главную страницу
В оглавление справки

Hosted by uCoz