регистронезависимое сравнение двух TCHAR - PullRequest
2 голосов
/ 09 февраля 2010

Как можно сравнить два отдельных символа (char или UTF-16 wchar_t с), игнорируя регистр?

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

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

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

Ответы [ 4 ]

2 голосов
/ 09 февраля 2010

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

1 голос
/ 09 февраля 2010

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

0 голосов
/ 09 февраля 2010

Если вы собираетесь ограничить себя английскими (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;
}

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

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

if (IsKeywordMatch(pszInput, "value"))
0 голосов
/ 09 февраля 2010

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

...