Pergunta

Ainda estou tentando decidir se o meu projeto (casa) deve usar UTF-8 strings (implementadas em termos de std :: string com funções específicas UTF-8 adicionais quando necessário) ou uma string de 16 bits (implementado como std :: wstring). O projeto é uma linguagem de programação e ambiente (como VB, é uma combinação de ambos).

Existem desejos poucos / restrições:

  • Seria legal se ele poderia rodar em hardware limitado, tais como computadores com memória limitada.
  • Eu quero o código para ser executado em Windows, Mac e (se os recursos permitirem) Linux.
  • eu vou estar usando wxWidgets como minha camada de GUI, mas eu quero o código que interage com que kit de ferramentas confinados em um canto da base de código (I terá executáveis ??não-GUI).
  • Eu gostaria de evitar trabalhar com dois tipos diferentes de cordas quando se trabalha com texto visível ao usuário e com os dados do aplicativo.

Atualmente, estou trabalhando com std :: string, com a intenção de usar UTF-8 funções de manipulação somente quando necessário. Ele requer menos memória, e parece ser a direção muitas aplicações estão indo de qualquer maneira.

Se você recomendaria uma codificação de 16 bits, que um: UTF-16 ? UCS-2 ? Outro?

Foi útil?

Solução

Eu recomendaria UTF-16 para qualquer tipo de manipulação de dados e interface do usuário. O Mac OS X e Win32 API usa UTF-16, mesmo para wxWidgets, QT, UTI, Xerces, e outros. UTF-8 poderia ser melhor para intercâmbio e armazenamento de dados. Consulte http://unicode.org/notes/tn12/ .

Mas o que você escolher, eu recomendaria definitivamente contra std :: string com UTF-8 "apenas quando necessário".

Vá todo o caminho com UTF-16 ou UTF-8, mas não misturar e combinar, que está pedindo para ter problemas.

Outras dicas

UTF-16 ainda é uma codificação variável de caracteres de comprimento (Há mais de 2 ^ 16 codepoints unicode), as operações de modo que você não pode fazer O (1) indexação string. Se você está fazendo um monte de esse tipo de coisa, você não está economizando nada em velocidade sobre UTF-8. Por outro lado, se o seu texto inclui uma série de codepoints no 256-65535 gama, UTF-16 pode ser uma melhoria substancial em tamanho. UCS-2 é uma variação do UTF-16 que é comprimento fixo, ao custo de proibir quaisquer pontos de código maiores do que 2 ^ 16.

Sem saber mais sobre suas necessidades, eu pessoalmente ir para UTF-8. É o mais fácil de lidar com por todas as razões outros já mencionados.

Eu nunca encontrou quaisquer razões para o uso de qualquer outra coisa do que UTF-8 para ser honesto.

Se você decidir ir com codificação UTF-8, confira esta biblioteca: http://utfcpp.sourceforge.net /

Pode fazer a sua vida muito mais fácil.

Eu realmente escrevi um aplicativo amplamente utilizado (5million + usuários) para cada kilobyte utilizado acrescenta-se, literalmente. Apesar disso, eu apenas preso a wxString. Tenho configurado para ser derivado de std :: wstring, para que eu possa passá-los para funções que esperam um const wstring &.

Por favor note que std :: wstring é Unicode nativo no Mac (sem UTF-16 necessárias para personagens acima U + 10000), e, portanto, ele usa 4 bytes / wchar_t. A grande vantagem disso é que i ++ você recebe o carácter seguinte, sempre. Em Win32 que é verdadeiro em apenas 99,9% dos casos. Como um programador companheiro, você vai entender o quão pouco é 99,9%.

Mas se você não está convencido, escrever a função em maiúsculas uma std :: string [UTF-8] e uma std :: wstring. Aqueles 2 funções irá dizer-lhe que maneira é loucura.

O seu formato em disco é outra questão. Para portabilidade, que deve ser UTF-8. Não há nenhuma preocupação endianness em UTF-8, nem uma discussão sobre a largura (2/4). Isso pode ser por isso que muitos programas parecem usar UTF-8.

Em uma nota ligeiramente relacionado, por favor leia-se sobre comparações de cadeia Unicode e normalização. Ou você vai acabar com o mesmo bug como .NET, onde você pode ter duas variáveis ??foo e Foo diferindo apenas na normalização (invisível).

MicroATX é praticamente um formato PC motherboard padrão, mais capaz de 4-8 GB de RAM. Se você está falando picoATX talvez você está limitado a 1-2 GB RAM. Mesmo assim, isso é muito para um ambiente de desenvolvimento. Eu ainda ia ficar com UTF-8 por razões mencionadas acima, mas a memória não deve ser sua preocupação.

Pelo que tenho lido, é melhor usar um 16-bit codificar internamente a menos que você estiver em curto memória. Ele se encaixa quase todas as línguas vivas em um caractere

Eu também olhar em UTI . Se você não está indo usar certa STL dispõe de cordas, usando os tipos de cordas UTI pode ser melhor para você.

Você considerou usando wxStrings? Se bem me lembro, eles podem fazer utf-8 <->. Conversões Unicode e vai torná-lo um pouco mais fácil quando você tem que passar cadeias de e para a interface do usuário

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