Функция CompareString

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

Синтаксис

int CompareString(      

    LCID Locale,
    DWORD dwCmpFlags,
    DWORD lpString1,
    DWORD cchCount1,
    DWORD lpString2,
    DWORD cchCount2
);

Параметры

Locale

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

Идентификатор

Описание

LOCALE_SYSTEM_DEFAULT Язык страны (местности) в системе по умолчанию.
LOCALE_USER_DEFAULT Язык страны (местности) текущего пользователя, по умолчанию.
LOCALE_NEUTRAL Нейтральный локальный объект, нейтральный язык.
LOCALE_INVARIANT Используется, чтобы выполнить сравнение независимое от языка страны..

dwCmpFlags

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

Флажок

Описание

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

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

cchCount1

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

lpString2

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

cchCount2

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

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

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

 

Значение

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

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

ERROR_INVALID_FLAGS
ERROR_INVALID_PARAMETER

Замечания

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

Обычно, функции CompareString, CompareStringEx, lstrcmp и lstrcmpi оценивают в строке символ за символом. Однако, у многих языков есть многосимвольные элементы, такие как двухсимвольная пара 'CH' в традиционном испанском языке. Функция CompareString и CompareStringEx используя язык страны (местности) передает в параметр Locale (или 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, LCMapString и FindNLSString (и, соответственно,  базирующиеся на наименовании территорий функции CompareStringEx, LCMapStringEx и FindNLSStringEx) по умолчанию используют сортировку слов, но если их вызывающая программа устанавливает флажок SORT_STRINGSORT, то используется сортировка строк.

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

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

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

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

Программы, которые предназначаются для того, чтобы выполняться только в среде Windows Vista и позже должны использовать CompareStringEx в предпочтении к этой функции. CompareStringEx оказывает хорошую поддержку для дополнительных местных языков (supplemental locales). Однако, CompareStringEx не поддерживается в версиях Windows до Windows Vista.

Выполнение

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

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

Если Вы вызываете версию ASCII (CompareStringA), то, функция делает преобразование не через системную кодовую страницу по умолчанию, а преобразует параметры через кодовую страницу языка страны (местности) по умолчанию, который Вы определили. Между прочим, это означает, что Вы никогда не сможете использовать CompareStringA, чтобы обработать 8-битовый текст формата (UTF-8) Unicode.

Флажок 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; то есть строки считаются "равными" в смысле сопоставления, хотя они не обязательно идентичны.

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

 

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

Windows 95/98/Me:  Функция CompareStringW поддерживается Microsoft Layer for Unicode (MSLU). Чтобы использовать MLSU, Вы должны добавить некоторые файлы к своему приложению, как это определено в Microsoft Layer для Unicode для системной среды Windows 95/98/Me.

Смотри также

Обзор Строки, Функции, используемые строками, Информация о пользовательском языке страны (местности), FoldString, CompareStringEx, CompareStringOrdinal, GetSystemDefaultLCID, GetUserDefaultLCID, IsNLSDefinedString, LCMapString, FindNLSString, lstrcmp, lstrcmpi, MAKELCID

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

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

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

Hosted by uCoz