Question

Comment convertir une chaîne wchar_t de majuscules en minuscules en C ++?

La chaîne contient un mélange de caractères japonais, chinois, allemands et grecs.

J'ai pensé à utiliser Towlower ...

http://msdn.microsoft.com/ fr-us / bibliothèque / 8h19t214% 28VS.80% 29.aspx

.. mais la documentation indique que:

  

La conversion de casse de Towlower dépend des paramètres régionaux. Seuls les caractères pertinents pour les paramètres régionaux en vigueur sont modifiés au cas où.

Edit: Peut-être que je devrais décrire ce que je fais. Je reçois une requête de recherche Unicode d'un utilisateur. C'est à l'origine au format UTF-8, mais je le convertis en widechar (je me trompe peut-être sur le libellé). Mon débogueur (VS2008) affiche correctement les caractères japonais, allemand, etc. dans la & "Surveillance rapide des variables &"; Je dois parcourir un autre ensemble de données en Unicode et trouver des correspondances dans la chaîne de recherche. Bien que ce ne soit pas un problème pour moi lorsque la recherche est sensible à la casse, il est plus problématique de le faire en respectant la casse. Mon approche (peut-être naïve) pour résoudre le problème consisterait à convertir toutes les données d'entrée et les données de sortie en minuscules, puis à les comparer.

Était-ce utile?

La solution

Si votre chaîne contient tous ces caractères, le jeu de codes doit être basé sur Unicode. Si elle est correctement implémentée, Unicode (chapitre 4 ' Propriétés du caractère ') définit les propriétés du caractère, indiquant notamment si le caractère est en majuscule et en minuscule, etc.

Etant donné ce préambule, la towlower() fonction de <wctype.h> est l'outil à utiliser. Si cela ne fonctionne pas, vous avez un problème de qualité de mise en œuvre à discuter avec votre fournisseur. Si vous trouvez que le fournisseur ne répond pas, examinez d'autres bibliothèques. Dans ce cas, vous pouvez envisager de ICU (Composants internationaux pour Unicode).

Autres conseils

Vous avez un vilain problème en main. Un environnement local japonais ne facilitera pas la conversion de l'allemand et vice versa. Il y a des langues qui n'ont pas non plus le concept de captalisation (toupper et les amis seraient un no-op ici, je suppose). Alors, pouvez-vous diviser votre chaîne en morceaux individuels de mots de la même langue? Si vous le pouvez, vous pouvez convertir les morceaux et les ficeler.

Cette réponse à une offre à commandes indique comment utiliser des facettes pour gérer plusieurs paramètres régionaux. S'il s'agit de Windows, vous pouvez envisager d'utiliser les fonctions de l'API win32. Si vous pouvez travailler avec C ++ .NET (C ++ géré), vous pouvez utiliser les fonctions char.ToLower et string.ToLower compatibles Unicode.

Consultez _wcslwr_l dans <wchar.h> ( MSDN ).

Vous devriez pouvoir exécuter la fonction sur l'entrée pour chacun des paramètres régionaux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top