以编程方式判断Unicode字符是否占用终端中的多个字符空间

asm*_*rer 9 python unicode terminal

我发现在Mac OS X终端中,一些Unicode字符会占用多个字符空间.例如27FC(从条向右的长箭头).它打印两个字符宽,但第二个字符打印在下一个字符的顶部,所以你必须这样做?<space>才能正确打印.例如,?a打印像. 箭头+ a (我把字体大小设置得很大,你可以看到它,但它适用于所有字体大小).

顺便说一下,这是Mac OS X 10.6终端应用程序中的Menlo字体.

23B3(SUMMATION TOP)实际打印为两个字符宽高(至少在Safari中,它也在浏览器中执行此操作,注意它与上面的行重叠)⎲

但是,在Ubuntu的终端中,这些字符中没有一个比一个字符打印更宽或更高.

有没有办法以编程方式判断角色是否占用多个空格?

我正在使用Python,所以在纯Python或POSIX上工作的东西(即,我可以使用os模块调用一些bash命令)将是首选.

此外,我应该注意,如果我将终端的字体设置中的"字符间距"设置增加到1.5(从默认的1.0),那么它看起来像 箭头+间隔.

此外,如果答案能够对所有这些有所了解(例如,为什么会发生这种情况,那就太好了)

mes*_*iac 6

虽然它与您给出的具体示例无关(所有这些示例都以Ubuntu为单位显示为单个字符的大小),但CJK字符具有unicode属性,表示它们比正常宽,并且在某些示例中以双倍宽度显示终端.

例如,在python中:

# 'a' is a normal (narrow) character
# '?' can be interpreted as a double-width (wide) character
import unicodedata
assert unicodedata.east_asian_width('a') == 'N'
assert unicodedata.east_asian_width('?') == 'W'
Run Code Online (Sandbox Code Playgroud)

除此之外,我认为没有规定某些角色占用多少空间,除了你使用的任何字体的字形大小(你的终端可能忽略了因为Ignacio给出的原因).

有关"东亚宽度"属性的更多信息,请访问http://www.unicode.org/reports/tr11/


Ign*_*ams 4

不,因为无法知道终端正在使用什么字体。吸取教训,始终使用等宽字体。

发生这种情况是因为终端使用“单元格”字体布局引擎(即字符打印在特定的 X 和 Y 坐标,无论其实际大小如何),而浏览器使用“流”字体布局引擎(后续字符打印在前一个字符的位置)字符结束)。

  • 还有一些 unicode 字符的行为与典型字符不同,例如为前面的字符添加重音符号的字符,或者将格式从左到右翻转为从右到左的字符。 (2认同)
  • 我认为你误解了这个问题。我*正在*使用等宽字体。不过,终端打印的某些 unicode 字符大于一个单元格。无论我使用什么字体(等宽字体或非等宽字体),它的作用都完全相同。 (2认同)