获取Unicode字符中字符串的“实际”长度

11

比如给定一个字符,例如"" (\xe2\x9c\xae),还可以是类似于 "Σ", "д" 或 "Λ" 的其他字符,我想找出该字符在屏幕上实际占用的长度。

例如:

len("✮")
len("\xe2\x9c\xae")

两个都返回3,但应该是1


2
尝试运行:len("✮".decode("utf-8")) - Grijesh Chauhan
这不会取决于所使用的字体以及周围的字符是什么吗 - 你想要做的整体是什么? - mmmmmm
在Python 2.7.5中,len("\xe2\x9c\xae".decode('UTF-8'))可以完美运行。 - Cthulhu
2
这里有几种定义长度(和宽度)的方法。了解您需要此内容的目的会很有帮助:例如,您是想计算屏幕上一行可以容纳多少个字符吗? - deltab
2个回答

3
你可以尝试这样做:
unicodedata.normalize('NFC', u'✮')
len(u"✮")

UTF-8是一种unicode编码,用于处理特殊字符需要多个字节。请查看unicodedata.normalize()


3
甚至这也不能准确计算用户感知的字符或字形簇;一些使用变音符号的情况没有单一码点表示。我也不清楚UTF-8(具体而言)如何涉及此问题? - user395760
这也会返回 len(unicodedata.normalize('NFC', u'✮')) = 3。 - user3584604
即使没有变音符号,某些代码点也没有映射到任何字形(考虑控制字符、单词连接器、软连字符等)。无论如何规范化都无法摆脱这些问题。(回到主题:u'✮'已经处于正常形式,因此在这里规范化是无效的;OP实际的问题在于UTF-8编码是多字节的;希望到2022年我们都使用Python 3并且len()正确计算代码点而不是字节。) - Maëlan

-1

我对一个类似问题答案

您正在寻找当前输出上下文中的渲染宽度。对于图形用户界面,通常有一种方法可以直接查询此信息;对于文本环境,您只能猜测符合规范的渲染引擎可能会执行什么操作,并希望实际引擎与您的期望相匹配。


4
像素渲染宽度是另一个话题。我没看到有人问过这个问题。 - Thomas Weller
对于等宽文本输出,标准字形宽度是最小可寻址单位,我们关注的是该单位的倍数——这与像素宽度并没有太大区别。 - Simon Richter
这个问题与渲染无关。 - undefined
“当在屏幕上打印”与渲染有什么不相关的地方? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接