String To Lower/Upper în C ++

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ă?

0
fr hi bn
Rețineți că soluția actuală nu este compatibilă cu Unicode.
adăugat autor sorin, sursa

8 răspunsuri

#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

0
adăugat
Cred că este mai bine să folosiți "ghilimele mut" în astfel de exemple de cuvinte literale, mai degrabă decât "citate inteligente". Îl face mai bine în ceea ce privește copierea-lipirea-compilarea.
adăugat autor Ron Klein, sursa
Ar trebui să spuneți că trebuie să includeți pentru a utiliza transform
adăugat autor c0m4, sursa
Cum va funcționa acest lucru pentru șirurile non-ASCII?
adăugat autor Nikolai, sursa

VCL are SysUtils.hpp care are LowerCase (unicodeStringVar) și UpperCase (unicodeStringVar) tu. Folosesc acest lucru în C ++ Builder 2009.

0
adăugat

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ă ...

0
adăugat
> 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));
0
adăugat
Multumesc mult!
adăugat autor viksit, sursa

Dacă aveți Boost, atunci are cel mai simplu mod. Priviți to_upper ()/to_lower() în algoritmi de string Boost .

0
adăugat

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.

0
adăugat

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.

0
adăugat

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ă.

0
adăugat