Функция CompareString сравнивает две строки символов, используя указанный язык страны (местности).
int CompareString( LCID Locale, DWORD dwCmpFlags, DWORD lpString1, DWORD cchCount1, DWORD lpString2, DWORD cchCount2 ); |
[in] Указывает язык страны (местности), используемый для сопоставления. Этот параметр может быть одним из нижеследующих предопределенных локализующих идентификаторов. Этот параметр может также быть локализующим идентификатором, созданным макрокомандой MAKELCID. Для получения дополнительной информации об идентификаторах территорий, см. раздел Языки стран (местностей).
Идентификатор |
Описание |
LOCALE_SYSTEM_DEFAULT | Язык страны (местности) в системе по умолчанию. |
LOCALE_USER_DEFAULT | Язык страны (местности) текущего пользователя, по умолчанию. |
LOCALE_NEUTRAL | Нейтральный локальный объект, нейтральный язык. |
LOCALE_INVARIANT | Используется, чтобы выполнить сравнение независимое от языка страны.. |
[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 | Обрабатывает пунктуацию также, как символы. |
[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 |
Обычно, функции 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, то используется сортировка строк.
Когда сравнение должно следовать за персональными языковыми настройками пользователя, например, когда сортируются по порядку элементы органа управления Одноуровневого просмотрщика (ListView), сделайте одно из нижеследующего:
Когда результаты сравнения должны быть непротиворечивыми независимо от языка страны (местности), например при сравнении извлеченных данных, опираясь на предопределенный список или внутреннее значение, то используется CompareString. Любой из нижеследующих вызовов будет соответствовать даже тогда, когда параметр mystr - "INLAP", тогда как чувствительный к языку страны (местности) вызов функции lstrcmpi завершается ошибкой, если текущий язык страны (местности) - вьетнамский язык.
CompareString(LOCALE_INVARIANT, NORM_IGNORECASE, mystr, -1, _T("InLap"), -1); |
DWORD lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); CompareString(lcid, NORM_IGNORECASE, mystr, -1, _T("InLap"), -1); |
Функция 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. | |
Замечания по платформе | Не имеется |