Question

Quelle est la meilleure façon dont les gens ont trouvé pour convertir une chaîne en minuscules/majuscules en C++ ?

Le problème est compliqué par le fait que C++ n’est pas un langage de programmation uniquement anglais.Existe-t-il une bonne méthode multilingue ?

Était-ce utile?

La solution

#include <algorithm>
std::string data = "Abc";
std::transform(data.begin(), data.end(), data.begin(), ::toupper);

http://notfaq.wordpress.com/2007/08/04/cc-convert-string-to-upperlower-case/

Également, article CodeProject pour les méthodes de chaîne courantes : http://www.codeproject.com/KB/stl/STL_string_util.aspx

Autres conseils

> std::string data = “Abc”; 
> std::transform(data.begin(), data.end(), data.begin(), ::toupper);

Cela fonctionnera, mais cela utilisera la locale standard "C".Vous pouvez utiliser des facettes si vous avez besoin d'obtenir une valeur inférieure pour une autre langue.Le code ci-dessus utilisant des facettes serait :

locale loc("");
const ctype<char>& ct = use_facet<ctype<char> >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));

Pour les copieurs espérant utiliser la réponse de Nic Strong, notez l'erreur d'orthographe dans "use_factet" et le troisième paramètre manquant dans std::transform :

locale loc("");
const ctype<char>& ct = use_factet<ctype<char> >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));

devrait être

locale loc("");
const ctype<char>& ct = use_facet<ctype<char> >(loc);
transform(str.begin(), str.end(), str.begin(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));

Vous devriez également revoir cette question.Fondamentalement, le problème est que les bibliothèques C/C++ standard n'ont pas été conçues pour gérer les données Unicode, vous devrez donc vous tourner vers d'autres bibliothèques.

Cela peut changer à mesure que la norme C++ est mise à jour.Je sais que le prochain compilateur de Borland (CodeGear) prendra en charge Unicode, et je suppose que le compilateur C++ de Microsoft aura, ou possède déjà, des bibliothèques de chaînes prenant en charge Unicode.

Comme Darren vous l'a dit, la méthode la plus simple consiste à utiliser std::transform.

Mais attention, dans certaines langues, comme l'allemand par exemple, il n'y a pas toujours de correspondance individuelle entre les minuscules et les majuscules.Le caractère minuscule « esset » (ressemblant au caractère grec bêta) est transformé en « SS » en majuscule.

Si vous avez Boost, c'est le moyen le plus simple.Jettes un coup d'oeil à to_upper()/to_lower() dans les algorithmes de chaîne Boost.

J'ai trouvé un moyen de convertir la casse des caractères unicode (et multilingues), mais vous devez connaître/trouver (d'une manière ou d'une autre) les paramètres régionaux du caractère :

#include <locale.h>

_locale_t locale = _create_locale(LC_CTYPE, "Greek");
AfxMessageBox((CString)""+(TCHAR)_totupper_l(_T('α'), locale));
_free_locale(locale);

Je n'ai pas encore trouvé le moyen de le faire...Si quelqu'un sait comment faire, faites-le-moi savoir.

Définir les paramètres régionaux sur NULL ne fonctionne pas...

Le VCL a un SysUtils.hpp qui a LowerCase(unicodeStringVar) et UpperCase(unicodeStringVar) ce qui pourrait fonctionner pour vous.Je l'utilise dans C++ Builder 2009.

Ce que dit Steve est correct, mais je suppose que si votre code devait prendre en charge plusieurs langages, vous pourriez avoir une méthode d'usine qui encapsule un ensemble de méthodes qui effectuent le toUpper ou le toLower pertinent en fonction de ce langage.

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