String para inferior/superior em C++
Pergunta
Qual é a melhor maneira que as pessoas encontraram para fazer String em minúsculas/maiúsculas em C++?
A questão é complicada pelo fato de que C++ não é uma linguagem de programação apenas em inglês.Existe um bom método multilíngue?
Solução
#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/
Além disso, artigo do CodeProject para métodos de string comuns: http://www.codeproject.com/KB/stl/STL_string_util.aspx
Outras dicas
> std::string data = “Abc”;
> std::transform(data.begin(), data.end(), data.begin(), ::toupper);
Isso funcionará, mas usará o código de idioma "C" padrão.Você pode usar facetas se precisar obter um tolower para outro local.O código acima usando facetas seria:
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 copiadores que desejam usar a resposta de Nic Strong, observe o erro de ortografia em "use_factet" e o terceiro parâmetro ausente em 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));
deveria estar
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));
Você também deve revisar essa questão.Basicamente, o problema é que as bibliotecas C/C++ padrão não foram construídas para lidar com dados Unicode, então você terá que procurar outras bibliotecas.
Isso pode mudar à medida que o padrão C++ for atualizado.Eu sei que o próximo compilador da Borland (CodeGear) terá suporte a Unicode, e eu acho que o compilador C++ da Microsoft terá, ou já possui, bibliotecas de strings que suportam Unicode.
Como Darren lhe disse, o método mais fácil é usar std::transform.
Mas tome cuidado, pois em alguns idiomas, como o alemão, por exemplo, nem sempre há um mapeamento individual entre letras minúsculas e maiúsculas.O caractere minúsculo “esset” (parecido com o caractere grego beta) é transformado em “SS” em maiúsculas.
Se você tem Boost, então tem a maneira mais simples.Dê uma olhada em to_upper()/to_lower() em algoritmos de string Boost.
Eu encontrei uma maneira de converter o caso de caracteres Unicode (e multilíngues), mas você precisa saber/encontrar (de alguma forma) a localidade do caractere:
#include <locale.h>
_locale_t locale = _create_locale(LC_CTYPE, "Greek");
AfxMessageBox((CString)""+(TCHAR)_totupper_l(_T('α'), locale));
_free_locale(locale);
Ainda não encontrei uma maneira de fazer isso...Se alguém souber como, me avise.
Definir localidade como NULL não funciona...
O VCL
tem um SysUtils.hpp
que tem LowerCase(unicodeStringVar)
e UpperCase(unicodeStringVar)
o que pode funcionar para você.Eu uso isso no C++ Builder 2009.
O que Steve diz está certo, mas acho que se o seu código tivesse que suportar várias linguagens, você poderia ter um método de fábrica que encapsulasse um conjunto de métodos que executassem o toUpper ou toLower relevante com base nessa linguagem.