Como saber a largura de exibição preferida (em colunas) dos caracteres Unicode?

Em diferentes codificações de Unicode, por exemploUTF-16le ouUTF-8, um caractere pode ocupar 2 ou 3 bytes. Muitos aplicativos Unicode não cuidam da largura de exibição dos caracteres Unicode, assim como todas as letras latinas. Por exemplo, em80-column text, que deve conter40. Caracteres chineses ou80 Letras latinas em uma linha, mas a maioria dos aplicativos (como Eclipse, Notepad ++ e todos os editores de texto conhecidos, ouso se houver alguma boa exceção) apenas conta cada caractere chinês com 1 largura como letra latina. Isso certamente torna o formato do resultado feio e não alinhado.

Por exemplo, uma largura de tabulação de 8 obterá o seguinte resultado feio (conte todo o Unicode como 1 largura de exibição):

apple   10
banana  7
苹果      6
猕猴桃     31
pear    16

No entanto, o formato esperado é (conte cada caractere chinês como 2 de largura):

apple   10
banana  7
苹果    6
猕猴桃  31
pear    16

O cálculo incorreto na largura de exibição dos caracteres torna esses editores totalmente inúteis ao alinhar tabulações, quebra de linha e reformatação de parágrafos.

No entanto, a largura de um caractere pode variar entre fontes diferentes, mas em todos os casos de fonte de terminal de tamanho fixo, o caractere chinês sempre tem largura dupla. Ou seja, apesar da fonte, cada caractere chinês é preferido para exibição em 2 de largura.

Uma das soluções é: posso obter a largura correta convertendo a codificação emGB2312, noGB2312 codificar cada caractere chinês leva 2 bytes. no entanto, alguns caracteres Unicode não existem no conjunto de caracteres GB2312 (ouGBK conjunto de caracteres). E, em geral, não é uma boa ideia calcular a largura da exibição do tamanho codificado em bytes.

Para simplesmente calcular todos os caracteres em Unicode no intervalo de (\u0080..\uFFFF), pois a largura 2 também não está correta, porque também existem muitos caracteres de 1 largura espalhados no intervalo.

Também é difícil calcular a largura de exibição de letras árabes e coreanas, porque elas constroem uma palavra / caractere por número arbitrário de pontos de código Unicode.

Portanto, a largura de exibição de um ponto de código Unicode talvez não seja um número inteiro, eu acho que sim, eles podem ser aterrados em números inteiros na prática, pelo menos melhor que nenhum.

Portanto, existe algum atributo relacionado à largura de exibição preferencial de um caractere no padrão Unicode? Ou alguma função da biblioteca Java para calcular a largura de exibição?

questionAnswers(5)

yourAnswerToTheQuestion