如何在Python中获得组合Unicode字符串的“可见”长度?

2024-09-28 05:23:09 发布

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

如果我有一个包含组合字符的Python Unicode字符串,len报告一个与“seen”字符数不对应的值。在

例如,如果我有一个组合了上划线和下划线的字符串,例如u'A\u0332\u0305BC'len(u'A\u0332\u0305BC')报告5个字符;但是显示的字符串只有3个字符长。在

我如何获得“可见的”—即用户看到的字符串所占据的不同位置的数目—在Python中包含组合字形的Unicode字符串的长度?在


Tags: 字符串用户len报告unicode字符seen数目
3条回答

^{} module有一个函数combining,可用于确定单个字符是否为组合字符。如果它返回0,则可以将字符计数为非组合字符。在

import unicodedata
len(u''.join(ch for ch in u'A\u0332\u0305BC' if unicodedata.combining(ch) == 0))

或者,稍微简单一点:

^{pr2}$

如果您的regex风格支持匹配grapheme,那么可以使用\X

Demo

虽然默认的Python re模块不支持\X,但Matthew Barnett的regex module支持:

>>> len(regex.findall(r'\X', u'A\u0332\u0305BC'))
3

在Python2上,您需要在模式中使用u

^{pr2}$

组合字符不是唯一的零宽度字符:

>>> sum(1 for ch in u'\u200c' if unicodedata.combining(ch) == 0)
1

"\u200c""‌"是零宽度非连接符;它是非打印字符。)

在这种情况下,regex模块不工作:

^{pr2}$

我找到了正确处理上述情况的wcwidth

>>> from wcwidth import wcswidth
>>> wcswidth(u'A\u0332\u0305BC')
3
>>> wcswidth(u'\u200c')
0

但在用户596219的示例中似乎仍然不起作用:

>>> wcswidth('각')
4

相关问题 更多 >

    热门问题