2008-08-14 9 views
23

¿Cuál es la mejor manera que las personas han encontrado para hacer Cadena en minúsculas/Mayúsculas en C++?Cadena para Más Bajo/Superior en C++

El problema se complica por el hecho de que C++ no es un lenguaje de programación solo en inglés. ¿Hay un buen método multilingüe?

+3

Tenga en cuenta que la solución actual no es compatible con Unicode. – sorin

Respuesta

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

Asimismo, el artículo CodeProject de métodos de cadena comunes: http://www.codeproject.com/KB/stl/STL_string_util.aspx

+1

Debería decir que uno necesita #include para usar la transformación – c0m4

+7

Creo que es mejor usar "comillas tontas" en un ejemplo de cadena literal, en lugar de "comillas tipográficas". Lo hace mejor en términos de copiar-pegar-compilar. –

+3

¿Cómo funcionará esto para cadenas que no sean ASCII? – Nikolai

4

También debe revisar this question. Básicamente, el problema es que las bibliotecas estándar C/C++ no se crearon para manejar datos Unicode, por lo que tendrá que buscar en otras bibliotecas.

Esto puede cambiar a medida que se actualiza el estándar C++. Sé que el próximo compilador de Borland (CodeGear) tendrá soporte Unicode, y supongo que el compilador C++ de Microsoft tendrá, o ya tiene bibliotecas de cadenas que admitan Unicode.

2

Como le dijo Darren, el método más fácil es usar std :: transform.

Pero tenga en cuenta que en algunos idiomas, como el alemán, por ejemplo, no siempre hay un mapeo uno a uno entre mayúsculas y minúsculas. El carácter minúsculo "esset" (se parece al carácter griego beta) se transforma en "SS" en mayúsculas.

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

Esto funcionará, pero esto utilizará la configuración regional estándar "C". Puede usar facetas si necesita obtener un tolower para otra ubicación. El código anterior utilizando facetas sería:

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

¡Buen puntero gracias! – viksit

0

Lo que Steve dice es correcto, pero supongo que si su código tenía que soportar varios idiomas, usted podría tener un método de fábrica que encapsula un conjunto de métodos que hacen lo relevante toUpper o toLower según ese idioma.

6

para copiar-parches los que esperan utilizar Nic Strong respuesta, tenga en cuenta el error de ortografía en "use_factet" y el tercer parámetro que falta a std :: Transformar:

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

debería ser

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

Gracias Hexetic, parece que GMan lo limpió para nosotros :) –

1

he encontrado una manera de convertir el caso de Unicode (y multilingüe) caracteres, pero lo que necesita saber/encontrar (de alguna manera) la configuración regional del personaje:

#include <locale.h> 

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

no he encontrado una forma de hacerlo aún ... Yo alguien sabe cómo, házmelo saber.

configuración local a NULL no funciona ...

1

El VCL tiene un SysUtils.hpp que tiene LowerCase(unicodeStringVar) y UpperCase(unicodeStringVar) que podría funcionar para usted. Lo uso en C++ Builder 2009.

Cuestiones relacionadas