Tudo o que você nunca quis saber sobre a normalização Unicode
Normalização canônica
O Unicode inclui várias maneiras de codificar alguns caracteres, principalmente caracteres acentuados. A normalização canônica altera os pontos de código em uma forma de codificação canônica. Os pontos de código resultantes devem parecer idênticos aos originais, com exceção de erros nas fontes ou no mecanismo de renderização.
Quando usar
Como os resultados parecem idênticos, é sempre seguro aplicar a normalização canônica a uma cadeia de caracteres antes de armazená-la ou exibi-la, desde que você possa tolerar que o resultado não seja bit por bit idêntico à entrada.
A normalização canônica vem em 2 formas: NFD e NFC. Os dois são equivalentes no sentido de que se pode converter entre essas duas formas sem perda. Comparar duas seqüências de caracteres em NFC sempre dará o mesmo resultado que compará-las em NFD.
NFD
NFD tem os caracteres totalmente expandidos. Este é o formulário de normalização mais rápido para calcular, mas resulta em mais pontos de código (isto é, usa mais espaço).
Se você deseja comparar apenas duas cadeias que ainda não estão normalizadas, este é o formulário de normalização preferido, a menos que você saiba que precisa da normalização de compatibilidade.
NFC
A NFC recombina pontos de código quando possível depois de executar o algoritmo NFD. Isso leva um pouco mais de tempo, mas resulta em seqüências mais curtas.
Normalização de compatibilidade
O Unicode também inclui muitos caracteres que realmente não pertencem, mas foram usados em conjuntos de caracteres herdados. O Unicode os adicionou para permitir que o texto nesses conjuntos de caracteres seja processado como Unicode e depois convertido novamente sem perdas.
A normalização de compatibilidade os converte na sequência correspondente de caracteres "reais" e também executa a normalização canônica. Os resultados da normalização de compatibilidade podem não parecer idênticos aos originais.
Caracteres que incluem informações de formatação são substituídos por caracteres que não o fazem. Por exemplo, o caractere ⁹
é convertido em 9
. Outros não envolvem diferenças de formatação. Por exemplo, o caractere do número romano Ⅸ
é convertido em letras regulares IX
.
Obviamente, uma vez que essa transformação tenha sido executada, não é mais possível converter sem perdas no conjunto de caracteres original.
Quando usar
O Unicode Consortium sugere pensar na normalização da compatibilidade como uma ToUpperCase
transformação. É algo que pode ser útil em algumas circunstâncias, mas você não deve apenas aplicá-lo à vontade.
Um excelente caso de uso seria um mecanismo de pesquisa, pois você provavelmente desejaria que uma pesquisa 9
correspondesse ⁹
.
Uma coisa que você provavelmente não deve fazer é exibir o resultado da aplicação da normalização de compatibilidade ao usuário.
NFKC / NFKD
O formulário de normalização de compatibilidade vem em dois formulários NFKD e NFKC. Eles têm a mesma relação entre NFD e C.
Qualquer cadeia de caracteres no NFKC também é inerentemente no NFC e o mesmo para o NFKD e o NFD. Assim NFKD(x)=NFD(NFKC(x))
, e NFKC(x)=NFC(NFKD(x))
, etc.
Conclusão
Em caso de dúvida, siga a normalização canônica. Escolha NFC ou NFD com base na troca de espaço / velocidade aplicável ou com base no que é exigido por algo com o qual você está interagindo.