Pregunta

¿Cuál es la mejor manera en que las personas han encontrado para hacer Cadena a minúsculas / mayúsculas en C++?

El asunto se complica por el hecho de que C++ no es un inglés sólo lenguaje de programación.Hay una buena multilingüe método?

¿Fue útil?

Solución

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

También, CodeProject artículo para el común de la cadena de métodos: http://www.codeproject.com/KB/stl/STL_string_util.aspx

Otros consejos

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

Esto va a funcionar, pero esto va a utilizar el estándar "C" de la configuración regional.Usted puede utilizar las facetas si usted necesita para obtener un tolower para otra configuración regional.En el código anterior, el uso de las 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));

Para los copia-pega la esperanza de utilizar la Nic Fuerte de la respuesta, tenga en cuenta el error de ortografía en "use_factet" y la falta tercer parámetro 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));

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

También debe revisar esta pregunta.Básicamente el problema es que el estándar de C/C++ bibliotecas no fueron diseñadas para la gestión de datos Unicode, así que usted tendrá que mirar a otras bibliotecas.

Esto puede cambiar a medida que el estándar de C++ se actualiza.Sé el próximo compilador de Borland (CodeGear) tendrá soporte para Unicode, y me imagino que Microsoft C++ compilador tendrá, o ya tiene cadena de librerías que soportan Unicode.

Como Darren dicho, el método más fácil es usar std::transformar.

Pero ten en cuenta que en algunos idiomas, como el alemán, por ejemplo, no siempre se tiene una asignación de uno a uno entre mayúsculas y minúsculas.El "esset" carácter en minúscula (mira como el personaje griego beta) se transforma en "SS" en mayúsculas.

Si usted tiene Boost, entonces es la forma más sencilla.Eche un vistazo a to_upper()/to_lower() en el Impulso de la cadena de algoritmos.

He encontrado una manera de convertir el caso de unicode (y multilingüe) caracteres, pero lo que necesita saber/buscar (de alguna manera) de 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 manera de hacerlo, pero aún así...I alguien sabe, que me haga saber.

La configuración regional a NULL no funciona...

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

Lo que Steve dice que es correcto, pero supongo que si su código tuvo que soportar varios lenguajes, usted podría tener una fábrica método que encapsula un conjunto de métodos que hacer las pertinentes toUpper o toLower basado en ese idioma.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top