Pergunta

Nós temos um conjunto de aplicativos que foram desenvolvidos para o conjunto de caracteres ASCII. Agora, estamos a tentar instalá-lo na Islândia, e estão correndo em problemas onde os personagens islandeses estão a ficar asneira.

Estamos trabalhando através de nossos problemas, mas eu queria saber: Existe um bom "guia" lá fora para escrever código C ++ que é projetado para caracteres de 8 bits e que irá funcionar correctamente quando UTF-8 dados é dado a ele ?

Eu não posso esperar todos poderão ler todo o padrão Unicode, mas se há algo mais digerível disponível, eu gostaria de compartilhar com a equipe para que não execute estas questões novamente.

Re-escrever todos os aplicativos para usar wchar_t ou alguma outra representação de cadeia não é viável neste momento. Vou também nota que esses aplicativos se comunicam através de redes com servidores e dispositivos que usam caracteres de 8 bits, por isso mesmo que fizemos Unicode internamente, ainda teríamos problemas com tradução nas fronteiras. Para a maior parte, estas aplicações apenas passar dados ao redor; eles não "processo" o texto de qualquer outra forma de copiá-lo de lugar para lugar.

Os sistemas operacionais utilizados são Windows e Linux. Nós usamos std :: string e strings C planície de idade. (E não me peça para defender qualquer das decisões de design. Estou apenas tentando ajudar a corrigir a bagunça.)


Aqui está uma lista do que tem sido sugerido:

Foi útil?

Solução

Isto parece um guia rápido abrangente:
http://www.cl.cam.ac.uk/~mgk25/ unicode.html

Outras dicas

Basta ter 8-bit limpo, em sua maior parte. No entanto, você terá que estar ciente de que qualquer não-ASCII splits de caracteres em vários bytes, então você deve ter em conta esta se a linha de quebra ou truncar o texto para exibição.

UTF-8 tem a vantagem de que você sempre pode dizer onde você está em um carácter multi-byte: se o bit 7 é definido e mordeu 6 reset (byte é 0x80-0xBF) este é um byte, enquanto que se os bits 7 e 6 são definidas e 5 é reposto (0xC0-0xDF) é um byte com um byte; se 7, 6 e 5 são definidas e 4 é reposto (0xE0-0xEF) é um byte inicial com dois bytes de fuga, e assim por diante. O número de bits consecutivos definidos no bit mais significativo é o número total de bytes que compõem o personagem. Ou seja:

110x xxxx = two-byte caráter
1110 xxxx = três bytes caráter
1111 0xxx = quatro bytes caráter
etc

O alfabeto islandês é todo contido em ISO 8859-1 e, portanto, o Windows-1252. Se este é um aplicativo de modo de console, estar ciente de que o console usa páginas de código IBM, assim (dependendo da localidade do sistema) pode exibir em 437, 850, ou 861 . Windows tem nenhum suporte de exibição nativa para UTF-8; você deve transformar a UTF-16 e usar APIs Unicode.

Chamando SetConsoleCP e SetConsoleOutputCP, especificando página de códigos 1252, vai ajudar com seu problema, se é um aplicativo de modo de console. Infelizmente, a fonte do console selecionado tem que ser uma fonte que suporta a página de códigos, e eu não posso ver uma maneira de definir a fonte. As fontes bitmap padrão suportam apenas a página de código OEM padrão do sistema.

Esteja ciente de que unicode completo não se encaixa em 16bit caracteres; então ou utilizar caracteres de 32 bits, ou codificação de largura variável (UTF-8 é o mais popular).

UTF-8 foi projetado exatamente com os seus problemas em mente. Uma coisa que eu seria de cerca de cuidado é que ASCII é realmente um 7-bit de codificação, por isso, se qualquer parte de sua infra-estrutura está usando o 8o bit para outros fins, que pode ser complicado.

Você pode querer verificar para fora UTI . Eles podem ter funções disponíveis que tornam o trabalho com UTF-8 cordas mais fácil.

usos islandeses ISO latino-1, então oito bits deve ser suficiente. Precisamos de mais detalhes para descobrir o que está acontecendo.

Icelandic, como francês, alemão, e mais outras línguas da Europa Ocidental, pode ser suportado utilizando um conjunto de 8-bit caracteres (CP1252 no Windows, ISO 8859-1 aka Latin1 on * x). Esta foi a abordagem padrão antes Unicode foi inventado, e ainda é bastante comum. Como você diz que tem uma restrição que você não pode reescrever seu aplicativo para uso wchar, e você não precisa.

Você não deve se surpreender que UTF-8 está causando problemas; UTF-8 codifica os caracteres não ASCII (por exemplo, os caracteres acentuados latino, espinho, eth, etc.) como dois bytes cada.

O conselho único general que pode ser dado é bastante simples (em teoria): (1) decidir o conjunto de caracteres que você está indo para suporte (Unicode, Latin1, CP1252, ...) em seu sistema (2) se você está sendo dados fornecidos codificados em alguma outra forma (por exemplo, UTF-8), em seguida, transcodificar-lo ao seu padrão (por exemplo CP1252) na fronteira do sistema (3) se você precisa fornecer dados codificados em alguma outra forma, ...

Você pode querer usar caracteres largos (wchar_t em vez de carvão e std :: wstring em vez de std :: string). Isso não resolve automaticamente 100% dos seus problemas, mas é bom primeiro passo.

Além disso, use funções de string que são Unicode-aware (consulte a documentação). Se algo manipula caracteres largos ou corda que, geralmente, está ciente de que eles são largas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top