Question

Qu'est-ce qu'un bon moyen de comparer deux caractères individuels (soit char ou UTF-16 wchar_ts) ignorant la casse?

Une implémentation triviale serait en majuscule ou en minuscule deux. Est-ce un de ces considérés comme mieux, ou y at-il d'autres méthodes?

Je comprends qu'une comparaison tout à fait correct est pas possible avec tous les détails de Unicode. La comparaison est destinée principalement pour une analyse de base des fichiers de configuration et micro grammaires, si la perfection n'est pas nécessaire. Je suis à la recherche d'une mise en œuvre sans trop de mal sous la restriction de comparaison par caractère.

[modifier] Ces fichiers de configuration peuvent contenir du texte affiché à l'utilisateur. En outre, lors de l'analyse d'entrée d'utilisateur, je ne peux pas éviter que le texte unicode.

Était-ce utile?

La solution

Vous avez besoin CompareStringEx. Il prend les caractères larges et a un drapeau insensible à la casse.

Autres conseils

Tout d'abord les convertir en chaînes, par exemple faire un tableau de deux TCHARs, copiez votre TCHAR au premier et mettre le second à _T ( « \ 0 »). Ensuite, appelez lstrcmpi ou CompareString. Ces deux pourraient être insuffisants en fonction de vos besoins, mais ils sont un bon début. Par exemple, si vous voulez UPCASE ß, ou si l'utilisateur utilise turc et que vous voulez que j'UPCASE, faites vous-même est plus difficile que vous pensiez.

Ne pas utiliser Unicode pour les fichiers de configuration si vous voulez comparaison insensible à la casse à base ASCII. Utilisez ASCII pour les fichiers. Ensuite, vous n'avez pas à vous soucier locales.

Si vous allez vous limiter à des mots clés anglais (ASCII), alors il y a un moyen trivial de faire la comparaison. Cela ne généralise pas si vous voulez utiliser des lettres autres que A-Z dans vos mots-clés, mais il fonctionne à merveille A-Z.

Si vous guarantee que l'une des valeurs que vous passez à cette fonction sera une bonne chaîne de mot-clé connu ne contenant que des caractères visibles dans la plage ASCII 32-127 (AZ, az, 0-9, la plupart des symboles), vous pouvez faire simple, bitmasking convertir minuscules en majuscules.

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;
}

Ce code est PAS une chaîne d'usage général comparer, elle est spécialisée pour comparer un bien connu mot-clé à une chaîne d'entrée. Il traitera {} comme majuscule de [], `en majuscules @, ~ en majuscules ^, mais si l'une des entrées de cette fonction est garanti pour contenir aucun de ces caractères, il ne sera pas question.

Il est destiné à être utilisé comme ceci

if (IsKeywordMatch(pszInput, "value"))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top