以编程方式告诉Unicode字符是否在一个终端中占用多个字符空间

2024-09-28 21:49:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现在macosx终端中,一些Unicode字符占用了不止一个字符空间。例如27FC(从条向右长箭头)。它打印两个字符宽,但第二个字符打印在下一个字符的顶部,因此您必须执行⟼<space>操作才能正确打印。例如,⟼a打印如下。 Arrow + a (我把字号调大以便你能看到,但它对所有字号都适用)。

顺便说一下,这是macosx10.6终端应用程序中的Menlo字体。

23B3(SUMMATION TOP)实际上打印为两个字符宽高(至少在Safari中,它在浏览器中也是这样做的,注意它是如何与上面的行重叠的)⎲

然而,在Ubuntu的终端中,这些字符打印的宽度或高度都不超过一个字符。

有没有一种方法可以通过编程来判断一个字符是否占用多个空格?

我使用的是Python,因此最好使用纯Python或POSIX(即,我可以使用os模块调用bash命令)。

另外,我应该注意,如果我把终端字体设置中的“字符间距”设置增加到1.5(从默认的1.0),那么它看起来像 ^{img2}。

另外,如果有一个答案能让我们对这一切有一些了解,那就太好了(比如,为什么会这样呢?)


Tags: 应用程序终端topunicode字体空间space箭头
3条回答

虽然它与您给出的特定示例无关(在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'

除此之外,我认为除了你使用的任何字体的字形大小(你的终端可能因为Ignacio给出的原因而忽略了)之外,对于某些字符应该占用多少空间没有一个规范。在

有关“东亚宽度”属性的详细信息,请参见http://www.unicode.org/reports/tr11/

这是OSX终端中的一个错误。在

我不建议尝试解决它,因为它会在其他系统(如Linux)上崩溃,最终可能会在Mac上修复。它也会混淆任何人粘贴到另一个应用程序。在

不,因为没有办法知道终端使用的是什么字体。永远使用等宽字体,吸取教训。在

这是因为终端使用的是“单元格”字体布局引擎(即字符打印在特定的X和Y坐标上,而不管其实际大小),而浏览器使用的是“flow”字体布局引擎(后续字符在前一个字符结束处打印)。在

相关问题 更多 >