Pergunta

O que é a diferença entre UTF e UCS.

Quais são as melhores maneiras de representar não conjuntos de caracteres europeus (usando UTF) em strings C ++. Eu gostaria de saber suas recomendações para:

  • representação interna dentro do código
    • Para a manipulação de cadeia em tempo de execução
    • Para usar a corda para fins de exibição.
  • Melhor representação de armazenamento ( i. No arquivo)
  • Melhor em formato de transporte de fio (de transferência entre a aplicação que pode ser em arquitecturas diferentes e têm um padrão local diferente)
Foi útil?

Solução

O que é a diferença entre UTF e UCS.

codificações UCS são fixos largura, e são marcados por quantos bytes são usados ??para cada personagem. Por exemplo, o UCS-2 requer 2 bytes por caractere. Personagens com pontos de código fora do intervalo disponível não podem ser codificados em uma codificação UCS.

codificações UTF são largura variável, e marcada pelo número mínimo de bits para armazenar um personagem. Por exemplo, UTF-16 exige, pelo menos, 16 bits (2 bytes) por caractere. Os caracteres com grandes pontos de código são codificados usando um número maior de bytes -. 4 bytes para caracteres astrais em UTF-16

  • representação interna dentro do código
  • Melhor representação de armazenamento (ou seja, em arquivo)
  • Melhor em formato de transporte de arame (Transferência entre aplicativo que pode estar em arquiteturas diferentes e têm uma localidade padrão diferente)

Para sistemas modernos, o armazenamento e transporte mais razoável codificação é UTF-8. Há casos especiais em que os outros possam ser apropriadas - UTF-7 para servidores de correio velhos, UTF-16 para editores de texto mal escrito - mas UTF-8 é mais comum

.

representação interna preferido dependerá de sua plataforma. No Windows, é UTF-16. Em UNIX, é UCS-4. Cada um tem seus pontos bons:

  • UTF-16 cordas nunca use mais memória do que uma cadeia UCS-4. Se você armazenar muitos grandes cadeias com caracteres principalmente no plano multi-lingual básica (BMP), UTF-16 vai exigir muito menos espaço do que UCS-4. Fora do BMP, ele usará a mesma quantidade.
  • UCS-4 é mais fácil de se trabalhar. Porque UTF-16 caracteres pode ser dividida em várias "pares substitutos", pode ser um desafio para dividir ou tornar uma corda corretamente. UCS-4 texto não tem esse problema. UCS-4 também atua como texto ASCII em matrizes "char", então algoritmos de texto existentes pode ser portado facilmente.

Finalmente, alguns sistemas utilizam UTF-8 como um formato interno. Isso é bom se você precisa de inter-operar com ASCII- existente ou sistemas baseados em ISO-8859 porque bytes NULL não estão presentes no meio de texto UTF-8 - eles estão em UTF-16 ou UCS-4.

Outras dicas

Gostaria de sugerir:

  • Para representação em código, wchar_t ou equivalente.
  • Para a representação de armazenamento, UTF-8.
  • Para representação do fio, UTF-8.

A vantagem de UTF-8 em situações de armazenagem e de arame é que endianness máquina não é um factor. A vantagem de usar um personagem tamanho fixo, como wchar_t no código é que você pode facilmente descobrir o comprimento de uma string sem ter que digitalizá-lo.

UTC é o Tempo Universal Coordenado, não um conjunto de caracteres (I não encontrou qualquer charset chamado UTC).

Para representação interna, você pode querer usar wchar_t para cada personagem, e std :: wstring para cordas. Eles usam exatamente 2 bytes para cada personagem, então procura e de acesso aleatório será rápido.

Para o armazenamento, se a maioria dos dados não são ASCII (código ou seja,> = 128), você pode querer usar UTF-16, que é quase o mesmo que wstring serializados e wchar_t.

Uma vez que UTF-16 pode ser pouco endian ou big endian, para o transporte de arame, tente convertê-lo para UTF-8, que é independente de arquitetura.

Na representação interna dentro do código, é melhor você fazer isso para ambos os caracteres europeus e não europeus:

\ uNNNN

caracteres no intervalo \ u0020 a \ u007E, e um pouco de espaços em branco (por exemplo, o fim da linha) podem ser escritas como caracteres comuns. Qualquer coisa acima \ u0080, se você escrevê-lo como um caractere ordinário, em seguida, ele irá compilar apenas na sua página de código (por exemplo, OK na França, mas quebrando na Rússia, OK na Rússia, mas quebrando no Japão, OK na China, mas quebrando nos EUA, etc .).

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