Domanda

Qual è il modo migliore in cui le persone hanno scoperto di trasformare la stringa in minuscolo/maiuscolo in C++?

La questione è complicata dal fatto che C++ non è un linguaggio di programmazione esclusivamente inglese.Esiste un buon metodo multilingue?

È stato utile?

Soluzione

#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/

Inoltre, articolo CodeProject per metodi di stringa comuni: http://www.codeproject.com/KB/stl/STL_string_util.aspx

Altri suggerimenti

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

Funzionerà, ma utilizzerà la locale "C" standard.Puoi utilizzare le sfaccettature se hai bisogno di ottenere un tolower per un'altra lingua.Il codice precedente che utilizza le sfaccettature sarebbe:

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

Per i copypaster che sperano di utilizzare la risposta di Nic Strong, notare l'errore di ortografia in "use_factet" e il terzo parametro mancante in 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));

dovrebbe essere

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

Dovresti anche rivedere questa domanda.Fondamentalmente il problema è che le librerie C/C++ standard non sono state create per gestire i dati Unicode, quindi dovrai cercare altre librerie.

Ciò potrebbe cambiare con l'aggiornamento dello standard C++.So che il prossimo compilatore di Borland (CodeGear) avrà il supporto Unicode e immagino che il compilatore C++ di Microsoft avrà, o ha già, librerie di stringhe che supportano Unicode.

Come ti ha detto Darren, il metodo più semplice è usare std::transform.

Ma attenzione: in alcune lingue, come ad esempio il tedesco, non esiste sempre una corrispondenza uno a uno tra minuscolo e maiuscolo.Il carattere minuscolo "esset" (assomiglia al carattere greco beta) viene trasformato in "SS" in maiuscolo.

Se hai Boost, allora ha il modo più semplice.Dai un'occhiata a to_upper()/to_lower() negli algoritmi di stringa Boost.

Ho trovato un modo per convertire il caso dei caratteri unicode (e multilingue), ma devi conoscere/trovare (in qualche modo) la locale del carattere:

#include <locale.h>

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

Non ho ancora trovato il modo di farlo...Qualcuno sa come, fatemelo sapere.

L'impostazione della locale su NULL non funziona...

IL VCL ha un SysUtils.hpp che ha LowerCase(unicodeStringVar) E UpperCase(unicodeStringVar) che potrebbe funzionare per te.Lo uso in C++ Builder 2009.

Ciò che Steve dice è giusto, ma immagino che se il tuo codice dovesse supportare diverse lingue, potresti avere un metodo factory che incapsula un insieme di metodi che eseguono le operazioni toUpper o toLower pertinenti in base a quella lingua.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top