Care este cel mai bun mod în care oamenii au găsit să facă String to Lower case/Upper case în C ++?
Problema este complicată de faptul că C ++ nu este un limbaj de programare în limba engleză. Există o metodă multilingvă bună?
#include
std::string data = "Abc";
std::transform(data.begin(), data.end(), data.begin(), ::toupper);
http://notfaq.wordpress.com/2007/08/04/cc-convert-string-la-upperlower caz/
Also, CodeProject article for common string methods: http://www.codeproject.com/KB/stl/STL_string_util.aspx
De asemenea, trebuie să consultați această întrebare . Practic, problema este că bibliotecile C/C ++ standard nu au fost construite pentru a gestiona datele Unicode, așa că trebuie să te uiți la alte biblioteci.
Acest lucru se poate modifica odată cu actualizarea standardului C ++. Știu că următorul compilator de la Borland (CodeGear) va avea suport Unicode și cred că compilatorul C ++ al Microsoft va avea sau deja are biblioteci de șir care suportă Unicode.
După cum ți-a spus Darren, cea mai ușoară metodă este de a folosi std :: transform.
Dar aveți grijă că într-o anumită limbă, cum ar fi limba germană, nu există întotdeauna o mapare una la alta între majuscule și majuscule. Caracterele "eset" (seamănă cu caracterele grecesc beta) se transformă în "SS" în majuscule.
> std::string data = ?Abc?;
> std::transform(data.begin(), data.end(), data.begin(), ::toupper);
Acest lucru va funcționa, dar acesta va utiliza locația standard "C". Puteți utiliza fațete dacă aveți nevoie să obțineți un tolower pentru o altă localitate. Codul de mai sus, utilizând fațete, ar fi:
locale loc("");
const ctype& ct = use_facet >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype::tolower), &ct));
Ceea ce spune Steve este corect, dar cred că dacă codul tău ar trebui să suporte mai multe limbi, ai putea avea o metodă din fabrică care încapsulează un set de metode care fac relevanța pentruUpper sauLower bazat pe acea limbă.
Pentru copiatorii care speră să utilizeze răspunsul lui Nic Strong, rețineți eroarea de ortografie în "use_factet" și parametrul treilea lipsă la std :: transform:
locale loc("");
const ctype& ct = use_factet >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype::tolower), &ct));
ar trebui să fie
locale loc("");
const ctype& ct = use_facet >(loc);
transform(str.begin(), str.end(), str.begin(), std::bind1st(std::mem_fun(&ctype::tolower), &ct));
Dacă aveți Boost, atunci are cel mai simplu mod. Priviți to_upper ()/to_lower () în algoritmi de string Boost .
Am găsit o modalitate de a converti cazul caracterelor unicode (și multilingve), dar trebuie să știți/găsiți (într-un fel) localizarea personajului:
#include
_locale_t locale = _create_locale(LC_CTYPE, "Greek");
AfxMessageBox((CString)""+(TCHAR)_totupper_l(_T('?'), locale));
_free_locale(locale);
Nu am gasit nici un fel de a face asta inca ... eu stiu cineva, sa ma anunti.
Setarea localizării la NULL nu funcționează ...
VCL
are SysUtils.hpp
care are LowerCase (unicodeStringVar)
și UpperCase (unicodeStringVar) tu. Folosesc acest lucru în C ++ Builder 2009.