2010-02-08 3 views
2

Что представляет собой хороший способ сравнить два отдельных символа (либо char, либо UTF-16 wchar_t s) игнорируя регистр?сравнение без учета регистра 2 TCHAR

Тривиальная реализация была бы верхней или нижней частью обеих. Один из них считается лучше, или существуют другие методы?

Я понимаю, что абсолютно точное сравнение невозможно со всеми подробностями Unicode. Сравнение подразумевается в основном для некоторого базового анализа файлов конфигурации и микрограмм, поэтому совершенство не требуется. Я искал не слишком ошибочную реализацию при ограничении сравнения по каждому символу.


Эти файлы конфигурации [править] может содержать текст, отображаемый пользователю. Кроме того, при анализе ввода пользователем я не могу избежать текста в Юникоде.

+0

Вам нужно ввести _compare_ пользователя? Если это так, вам нужно сделать это без учета регистра? –

+0

Да - например. при разрешении «6 кг» и «6 кг». – peterchen

ответ

2

Вам нужен CompareStringEx. Он принимает широкие символы и имеет флаг, нечувствительный к регистру.

+0

Вы имеете в виду «помещать их в односимвольную строку»? – peterchen

+0

Да. Я имею в виду это. – bmargulies

0

Не используйте Unicode для конфигурационных файлов, если вы хотите, чтобы сравнение на основе ASCII было нечувствительным к регистру. Используйте ASCII для этих файлов. Тогда вам не нужно беспокоиться о локалях.

0

Если вы собираетесь ограничить себя ключевыми словами на английском языке (ASCII), тогда есть тривиальный способ сравнения. Это не обобщает, если вы хотите использовать буквы, отличные от A-Z, в ваших ключевых словах, но прекрасно работает для A-Z.

Если вы гарантируете, что одно из значений, которое вы передадите этой функции, будет известной хорошей строкой ключевого слова, содержащей только видимые символы в диапазоне ASCII 32-127 (AZ, az, 0-9, большинство символов). Затем вы можете сделать простую битовую маска для преобразования нижнего в верхний регистр.

bool IsKeywordMatch(LPCTSTR psz, LPCTSTR pszKey) 
{ 
    while (pszKey[0]) 
    { 
     if (psz[0] < 0x20) 
      return false; 

     if ((psz[0] & ~0x20) != (pszKey[0] & ~0x20)) 
     return false; 

     ++psz; 
     ++pszKey; 
    } 
    return true; 
} 

Этот код НЕ строка общего назначения сравнения, специализирован для сравнения удачного ключевого слова в строку ввода. Он будет рассматривать {} как прописную букву [], `как uppercase @, ~ как uppercase ^, но если в одном из входов этой функции не будет содержаться ни один из этих символов, тогда это не имеет значения.

Он предназначен для использования как этот

if (IsKeywordMatch(pszInput, "value")) 
1

сначала преобразовать их в строки, например, сделать массив из двух TCHARs, скопируйте TCHAR к первому и установить вторую к _T (» \ 0'). Затем вызовите lstrcmpi или CompareString. Оба эти могут быть недостаточными в зависимости от ваших потребностей, но это хорошее начало. Например, если вы хотите поднять ß, или если пользователь использует турецкий язык, и вы хотите, чтобы я сделал это, сделать это самостоятельно сложнее, чем вы думали.

Смежные вопросы