在Unicode的不同编码中,例如UTF-16le或UTF-8,字符可能占用2或3个字节.许多Unicode应用程序不像处理所有拉丁字母那样处理Unicode字符的显示宽度.例如,在80列文本中,一行应包含40个中文字符或80个拉丁字母,但大多数应用程序(如Eclipse,Notepad ++和所有知名文本编辑器,我敢于有任何好的例外)只计算每个汉字作为拉丁字母的1宽度.这肯定会使结果格式变得丑陋且不对齐.
例如,制表符宽度为8将得到以下难看的结果(将所有Unicode计为1个显示宽度):
apple 10
banana 7
?? 6
??? 31
pear 16
Run Code Online (Sandbox Code Playgroud)
但是,预期的格式是(将每个汉字计为2个宽度):
apple 10
banana 7
?? 6
??? 31
pear 16
Run Code Online (Sandbox Code Playgroud)
对字符显示宽度的不正确计算使得这些编辑器在进行制表对齐,换行和段重组时完全没用.
虽然,字符的宽度可能会因不同的字体而异,但在固定大小的终端字体的所有情况下,汉字始终是双倍宽度.也就是说,尽管有字体,但每个汉字最好以2宽度显示.
解决方法之一是,我可以通过将编码转换为GB2312来获得正确的宽度,在GB2312编码中每个汉字占用2个字节.但是,GB2312字符集(或GBK字符集)中不存在某些Unicode字符.而且,一般来说,从编码大小(以字节为单位)计算显示宽度并不是一个好主意.
简单地计算(\u0080... \uFFFF)范围内Unicode中的所有字符,因为2宽度也不正确,因为在该范围内还散布着许多1宽度字符.
计算阿拉伯字母和韩文字母的显示宽度时也很困难,因为它们通过任意数量的Unicode代码点构造一个字/字符.
因此,Unicode代码点的显示宽度可能不是整数,我认为没关系,它们可以在实践中基于整数,至少比没有好.
那么,在Unicode标准中是否有与char的首选显示宽度相关的属性?或者任何Java库函数来计算显示宽度?
半角:常规宽度字符。
例如。'A' 和 '?'
全角:在显示器上占用两个等宽英文字符空间的字符
。'?', '?' 和 '?'
我需要这个函数的实现:
/**
* @return Is this character a full-width character or not.
*/
fun Char.isFullWidth(): Boolean
{
// What is the most efficient implementation here?
}
Run Code Online (Sandbox Code Playgroud)
不,这与这些字符的数据结构无关,而仅与显示的宽度有关。
我正在重构 HyLogger,这是一个专注于文本着色渐变的日志库。这是我遇到的问题:
如果您查看屏幕截图中打印的第一个渐变文本块,中间的全角文本将其后的渐变图案弄乱了,因为在调用 时string.length,即使它们占据两倍大小,它们也被视为一个字符。
您可能会问,为什么会有人打印全角字符?这是一个真正的问题,因为中文、日文或韩文等语言中的几乎所有字符都是全角字符,因此占用的空间是英文全角字符的两倍。
所以我需要一种方法来识别全角字符,以便我可以将它们计算为两个渐变像素而不是一个来解决图片中的问题。
Unicode 网站(以及报告)上有一个东亚宽度字符列表,但在呈现渐变文本块时遍历每个字符的整个列表可能效率不高。
Python 有这个Unicode 数据库库,一种可能的解决方案是使用 Jython 调用 python API,这会很重,而且效率可能不是很好。