Vou perguntar o que provavelmente é uma pergunta bastante controversa: "Uma das codificações mais populares, UTF-16, deve ser considerada prejudicial?"
Por que faço essa pergunta?
Quantos programadores estão cientes do fato de que o UTF-16 é realmente uma codificação de comprimento variável? Com isso, quero dizer que existem pontos de código que, representados como pares substitutos, levam mais de um elemento.
Eu sei; muitos aplicativos, estruturas e APIs usam UTF-16, como String de Java, String de C #, APIs Win32, bibliotecas Qt GUI, biblioteca ICU Unicode etc. No entanto, com tudo isso, existem muitos bugs básicos no processamento de caracteres fora do BMP (caracteres que devem ser codificados usando dois elementos UTF-16).
Por exemplo, tente editar um desses caracteres:
- 𝄞 ( U + 1D11E ) SÍMBOLO MUSICAL G CLEF
- 𝕥 ( U + 1D565 ) T PEQUENO DE CURSO DUPLO MATEMÁTICO
- 𝟶 ( U + 1D7F6 ) ZERO DO DÍGITO DO MONOSPAÇO MATEMÁTICO
- 𠂊 ( U + 2008A ) Personagem Han
Você pode perder alguns, dependendo das fontes instaladas. Esses caracteres estão todos fora do BMP (Basic Multilingual Plane). Se você não conseguir ver esses caracteres, tente também examiná-los na referência de Caracteres Unicode .
Por exemplo, tente criar nomes de arquivos no Windows que incluam esses caracteres; tente excluir esses caracteres com um "backspace" para ver como eles se comportam em diferentes aplicativos que usam UTF-16. Eu fiz alguns testes e os resultados são muito ruins:
- O Opera tem problemas com a edição (exclua 2 pressionamentos necessários no backspace)
- O bloco de notas não pode lidar com eles corretamente (exclua 2 pressionamentos necessários no backspace)
- Edição de nomes de arquivo nas caixas de diálogo da Janela quebradas (excluir 2 pressionadas necessárias no backspace)
- Todos os aplicativos QT3 não podem lidar com eles - mostram dois quadrados vazios em vez de um símbolo.
- O Python codifica esses caracteres incorretamente quando usado diretamente
u'X'!=unicode('X','utf-16')
em algumas plataformas quando o caractere X está fora do BMP. - O unicodedata do Python 2.5 falha ao obter propriedades desses caracteres quando o python é compilado com seqüências de caracteres Unicode UTF-16.
- O StackOverflow parece remover esses caracteres do texto se editado diretamente como caracteres Unicode (esses caracteres são mostrados usando escapes Unicode HTML).
- O WinForms TextBox pode gerar uma seqüência de caracteres inválida quando limitada ao MaxLength.
Parece que esses erros são extremamente fáceis de encontrar em muitos aplicativos que usam UTF-16.
Então ... Você acha que o UTF-16 deve ser considerado prejudicial?