Processamento Unicode em C ++


Respostas:


81
  • Use ICU para lidar com seus dados (ou uma biblioteca semelhante)
  • Em seu próprio armazenamento de dados, certifique-se de que tudo esteja armazenado na mesma codificação
  • Certifique-se de estar sempre usando sua biblioteca Unicode para tarefas mundanas como comprimento de string, status de capitalização, etc. Nunca use a biblioteca padrão embutida, a is_alphamenos que essa seja a definição que você deseja.
  • Eu não posso dizer o suficiente: nunca itere sobre os índices de a stringse você se preocupa com a correção, sempre use sua biblioteca Unicode para isso.

A menos que você os esteja tratando stringcomo dados binários.
Demi

10

Se você não se preocupa com a compatibilidade com os padrões C ++ anteriores, o padrão C ++ 11 atual tem suporte integrado a Unicode: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011 /n3242.pdf

Portanto, a prática realmente recomendada para processamento Unicode em C ++ seria usar os recursos integrados para isso. Isso nem sempre é uma possibilidade com bases de código mais antigas, porém, com o padrão sendo tão novo no momento.

EDIT: Para esclarecer, C ++ 11 é Unicode ciente de que agora tem suporte para Unicode literais e strings Unicode. No entanto, a biblioteca padrão tem apenas suporte limitado para processamento e conversão Unicode. Para suas necessidades atuais, isso pode ser o suficiente. No entanto, se você precisar fazer muito trabalho pesado agora, talvez ainda seja necessário usar algo como UTI para um processamento mais aprofundado. Existem algumas propostas em andamento para incluir um suporte mais robusto para a conversão de texto entre diferentes codificações. Meu palpite (e espero) é que isso faça parte do próximo relatório técnico .


Esse link para um documento padrão de rascunho não é muito útil sem uma referência a uma seção específica que descreve o "suporte Unicode integrado" que você está discutindo.
Ben Collins

1
@BenCollins Seção 2.14.5 "Literais de string" - discute literais de string, incluindo literais de string para codificações UTF-8, UTF-16 e UTF-32. Seção 22.4.1.4 "Codecvt de modelo de classe" - discute a classe codecvt usada para converter entre codificações de caracteres (incluindo UTF-8, UTF-16 e UTF-32). Há mais informações sobre o suporte Unicode espalhadas por todo o documento, mas essas parecem ser as seções mais críticas sobre o assunto.
eestrada


5

Aqui está uma lista de verificação para a programação do Windows:

  • Todas as strings entre _T ("minha string")
  • funções strlen () etc. substituídas por _tcslen () etc.
  • Use LPTSTR e LPCTSTR em vez de char * e const char *
  • Ao iniciar novos projetos no Dev Studio, certifique-se religiosamente de que a opção Unicode esteja selecionada nas propriedades do projeto.
  • Para strings C ++, use std :: wstring em vez de std :: string

11
Não use strings "T", caracteres e funções, a menos que pretenda fazer construções Unicode e ANSI. Se você pretende apenas fazer construções Unicode, apenas faça coisas regulares de caracteres largos: L "minha string larga" wcslen (L "minha string") etc
1800 INFORMAÇÕES

Concordo, use macros _T apenas se quiser texto genérico, ou seja, a capacidade de codificar para Unicode e Ascii / MBCS.

1
Caso você queira fazer Unicode e ANSI para strings C ++, use algo como typedef std :: basic_string <TCHAR> tString;
Serge,

Ah sim, eu sempre faço #ifdef _UNICODE #define tstring std :: wstring #else #define tstring std :: string #endif mas eu gosto mais do seu Serge.
Adam Pierce,

4
Honestamente, eu acho que UTF16 é um desperdício, deixar todas as codificações em UTF8 é mais simples e muito mais compatível com * nix.
chacham15

3

Veja a comparação de strings que não diferenciam maiúsculas de minúsculas em C ++

Essa pergunta tem um link para a documentação da Microsoft em Unicode: http://msdn.microsoft.com/en-us/library/cc194799.aspx

Se você olhar no lado esquerdo da navegação no MSDN, próximo a esse artigo, deverá encontrar muitas informações relacionadas às funções Unicode. É parte de um capítulo sobre "Codificação de caracteres" ( http://msdn.microsoft.com/en-us/library/cc194786.aspx )

Possui as seguintes subseções:

  • O modelo de página de código
  • Conjuntos de caracteres de byte duplo no Windows
  • Unicode
  • Problemas de compatibilidade em ambientes mistos
  • Conversão de Dados Unicode
  • Migrando programas baseados no Windows para Unicode
  • Resumo

2

Embora isso possa não ser a melhor prática para todos, você pode escrever suas próprias rotinas UNICODE em C ++ se desejar!

Acabei de fazer isso em um fim de semana. Aprendi muito, embora não garanta que esteja 100% livre de bugs, fiz muitos testes e parece funcionar corretamente.

Meu código está sob a licença New BSD e pode ser encontrado aqui:

http://code.google.com/p/netwidecc/downloads/list

É denominado WSUCONV e vem com um programa main () de amostra que converte entre UTF-8, UTF-16 e ASCII padrão. Se você jogar fora o código principal, terá uma ótima biblioteca para ler / escrever UNICODE.


1

Como foi dito acima, uma biblioteca é a melhor aposta quando se usa um sistema grande. No entanto, algumas vezes você quer lidar com as coisas sozinho (talvez porque a biblioteca usaria muitos recursos, como em um micro controlador). Nesse caso, você deseja uma biblioteca simples da qual possa copiar as partes para as coisas de que realmente precisa.

O código de exemplo de Willow Schlanger parece bom (veja sua resposta para mais detalhes).

Eu também encontrei outro que tem um código menor, mas não tem verificação completa de erros e só lida com UTF-8, mas era mais simples de remover partes.

Aqui está uma lista das bibliotecas incorporadas que parecem decentes.

Bibliotecas integradas



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.