在 Unicode 的不同编码中,例如UTF-16le或UTF-8,一个字符可能占用 2 或 3 个字节。许多 Unicode 应用程序不关心 Unicode 字符的显示宽度,就像它们都是拉丁字母一样。例如,在80列的文本中,一行应该包含40 个汉字或80 个拉丁字母,但大多数应用程序(如 Eclipse、Notepad++ 和所有知名的文本编辑器,如果有什么好的例外我敢说)只是计算每个汉字为 1 宽度为拉丁字母。这肯定会使结果格式丑陋且不对齐。
例如,tab-width 为 8 将得到以下丑陋的结果(将所有 Unicode 计为 1 显示宽度):
apple 10
banana 7
苹果 6
猕猴桃 31
pear 16
但是,预期的格式是(将每个汉字计算为 2 个宽度):
apple 10
banana 7
苹果 6
猕猴桃 31
pear 16
对字符显示宽度的不当计算使这些编辑器在进行制表符对齐、换行和段落重新格式化时完全无用。
虽然不同字体之间的字符宽度可能会有所不同,但在所有固定大小终端字体的情况下,汉字始终是双倍宽度。也就是说,不管字体如何,每个汉字最好以2宽显示。
一种解决方案是,我可以通过将编码转换为GB2312来获得正确的宽度,在GB2312编码中,每个汉字需要 2 个字节。但是,GB2312 字符集(或GBK字符集)中不存在某些 Unicode 字符。而且,一般来说,从编码大小(以字节为单位)计算显示宽度并不是一个好主意。
简单地将 Unicode 中 ( \u0080
.. \uFFFF
) 范围内的所有字符计算为 2 宽度也是不正确的,因为该范围内还有许多 1 宽度字符。
计算阿拉伯字母和韩文字母的显示宽度也很困难,因为它们是由任意数量的 Unicode 代码点构成一个单词/字符。
因此,Unicode 代码点的显示宽度可能不是整数,我认为没关系,它们在实践中可以基于整数,至少总比没有好。
那么,在 Unicode 标准中是否有任何与 char 的首选显示宽度相关的属性?或者任何Java库函数来计算显示宽度?