A conversão de texto CHAR ampla para minúsculas em C ++
-
06-07-2019 - |
Pergunta
Como faço para converter uma string wchar_t de maiúsculas para minúsculas em C ++?
A cadeia contém uma mistura de japonês, chinês, alemão e caracteres gregos.
Pensei em usar towlower ...
http://msdn.microsoft.com/ en-us / library / 8h19t214% 28VS.80% 29.aspx
.. mas a documentação diz que:
A conversão caso de towlower é específica de localidade. Apenas os caracteres relevantes para o local atual são alteradas no caso.
Edit: Talvez eu deveria descrever o que estou fazendo. Eu recebo uma consulta de pesquisa Unicode de um usuário. É originalmente em codificação UTF-8, mas eu estou convertendo-a em um widechar (posso estar errado sobre o texto). Meu depurador (VS2008) mostra corretamente o japonês, alemão, etc personagens em no "relógio rápida variável". Eu preciso passar por um outro conjunto de dados em Unicode e encontrar jogos da cadeia de pesquisa. Enquanto isso não é problema para mim fazer quando a pesquisa é sensível a maiúsculas, é mais problemático para fazê-lo caso insensível. Minha abordagem (talvez ingênuo) para resolver o problema seria converter todos os dados de entrada e dados de saída para minúsculas e depois compará-lo.
Solução
Se a seqüência contém todos os personagens, o codeset deve ser baseado em Unicode. Se for implementado corretamente, Unicode (Capítulo 4 ' Propriedades de caractere ') define propriedades de caracteres incluindo se o personagem é maiúscula eo mapeamento minúsculas, e assim por diante.
Dado que preâmbulo, a função towlower()
de <wctype.h>
é a ferramenta correta para uso. Se ele não fazer o trabalho, você tem um problema QoI (Qualidade de Implementação), para discutir com o seu fornecedor. Se você encontrar o fornecedor responde, em seguida olhar para bibliotecas alternativas. Neste caso, você pode considerar UTI (International Components for Unicode).
Outras dicas
Você tem um problema desagradável na mão. A localidade em japonês não vai ajudar a converter alemão e vice-versa. Existem línguas que não têm o conceito de captalization ou (toupper
e amigos seria um não-op aqui, suponho). Assim, você pode quebrar sua seqüência em pedaços individuais de palavras da mesma língua? Se você pode, então, você pode converter as peças e agregá-los para cima.
isso para espectáculos resposta como trabalhar com facetas de trabalhar com várias localidades. Se este for no Windows, você pode considerar o uso de funções da API Win32, se você pode trabalhar com C ++. NET (gerido C ++), você pode usar as funções char.ToLower
e string.ToLower
, que são compatíveis com Unicode.
Tenha um olhar em _wcslwr_l
em <wchar.h>
( MSDN ).
Você deve ser capaz de executar a função na entrada para cada um dos locais.