首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得Python中组合Unicode字符串的“可见”长度?

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

Stack Overflow用户
提问于 2015-10-26 17:10:28
回答 3查看 1.3K关注 0票数 12

如果我有一个包含组合字符的Python字符串,len将报告一个不对应于“已见”字符数的值。

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

如何获得“可见”(即用户所看到的字符串所占的不同位置)的长度?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-26 17:55:31

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

代码语言:javascript
复制
import unicodedata
len(u''.join(ch for ch in u'A\u0332\u0305BC' if unicodedata.combining(ch) == 0))

或者,稍微简单一点:

代码语言:javascript
复制
sum(1 for ch in u'A\u0332\u0305BC' if unicodedata.combining(ch) == 0)
票数 4
EN

Stack Overflow用户

发布于 2015-10-26 19:18:32

如果您有支持匹配字素的regex风格,则可以使用\X

演示

默认的Python模块不支持\X,而Matthew的正则模支持:

代码语言:javascript
复制
>>> len(regex.findall(r'\X', u'A\u0332\u0305BC'))
3

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

代码语言:javascript
复制
>>> regex.findall(u'\\X', u'A\u0332\u0305BC')
[u'A\u0332\u0305', u'B', u'C']
>>> len(regex.findall(u'\\X', u'A\u0332\u0305BC'))
3
票数 5
EN

Stack Overflow用户

发布于 2016-02-17 02:07:33

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

代码语言:javascript
复制
>>> sum(1 for ch in u'\u200c' if unicodedata.combining(ch) == 0)
1

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

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

代码语言:javascript
复制
>>> len(regex.findall(r'\X', u'\u200c'))
1

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

代码语言:javascript
复制
>>> from wcwidth import wcswidth
>>> wcswidth(u'A\u0332\u0305BC')
3
>>> wcswidth(u'\u200c')
0

但用户596219的例子似乎仍然不起作用:

代码语言:javascript
复制
>>> wcswidth('각')
4
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33351599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档