programas - Cadena para bajar/superior en C++
programa en c++ (9)
¿Cuál es la mejor manera que las personas han encontrado para hacer Cadena a minúsculas / Mayúsculas 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?
Como te dijo Darren, el método más fácil es usar std :: transform.
Pero ten 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.
El VCL
tiene un SysUtils.hpp
que tiene LowerCase(unicodeStringVar)
y UpperCase(unicodeStringVar)
que pueden funcionar para usted. Lo uso en C ++ Builder 2009.
He encontrado una forma de convertir el caso de caracteres unicode (y multilingües), pero necesitas 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);
Todavía no he encontrado la forma de hacerlo ... alguien sabe cómo hacerlo, házmelo saber.
Establecer locale en NULL no funciona ...
Lo que Steve dice es correcto, pero supongo que si tu código tuviera que admitir varios idiomas, podrías tener un método de fábrica que encapsule un conjunto de métodos que hagan lo relevante para Arriba o Para Bajo en función de ese idioma.
Para los copiadores que esperan usar la respuesta de Nic Strong, tenga en cuenta el error de ortografía en "use_factet" y el tercer parámetro faltante para 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));
debiera 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));
Si tienes Boost, entonces tiene la forma más simple. Eche un vistazo a to_upper () / to_lower () en los algoritmos de Boost string .
También deberías revisar esta pregunta . 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 de 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.
#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/
Además, artículo de CodeProject para métodos de cadenas comunes: http://www.codeproject.com/KB/stl/STL_string_util.aspx
> std::string data = “Abc”;
> std::transform(data.begin(), data.end(), data.begin(), ::toupper);
Esto funcionará, pero usará la configuración estándar "C". Puede usar facetas si necesita obtener un tolower para otra ubicación. El código anterior que usa 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));