免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: satoru
打印 上一主题 下一主题

如何计算中文字串长度 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-06-30 10:19 |只看该作者

回复 #7 zhasm 的帖子

呵呵,我要的是相反的效果.
不过,thank you all the same.

论坛徽章:
0
12 [报告]
发表于 2008-06-30 11:10 |只看该作者

回复 #6 limodou 的帖子

前辈的方法我试了一下
不过其中的unicodedata.east_asian_width我以前在看文档时就有些不明所以,传入汉字直接返回个'W',不知道什么意思,呵呵
前辈在这里是验证是否东亚文字?

论坛徽章:
0
13 [报告]
发表于 2008-06-30 11:35 |只看该作者
重看了有关python中的unicode的一些资料以后,我把原来encode('gbk')的地方换成了encode('utf-8'),程序照样正常运行.
这里的要点是用unicode的某种具体编码格式使得一个中文字符对应两个单位长度,要用len来表示宽度所以只好这样做,因为有些像str.center这样的方法就是依赖于len的计算方法来工作的.
比较符合语义的应该是limodou前辈的那种方法,不过我是没搞懂那个east_asian_width,呵呵

论坛徽章:
0
14 [报告]
发表于 2008-06-30 11:49 |只看该作者
语义那种也是我看别人的例子学来的,具体也不是太懂,但是好象目前还没有什么问题。

论坛徽章:
0
15 [报告]
发表于 2008-06-30 11:58 |只看该作者

回复 #14 limodou 的帖子

刚才在GOOGLE上搜相关的代码居然搜到ulipad去了,呵呵
不过我现在知道什么意思了,在一个帖子上看到的
F - East Asian Full-width
H - East Asian Half-width
W - East Asian Wide
Na - East Asian Narrow (Na)
A - East Asian Ambiguous (A)
N - Not East Asian
所以现在我把方法改成
def string_width(text):
    """
    text必须是unicode
    """
    import unicodedata
    s = 0
    for ch in text:
        if isinstance(ch, unicode):
            if unicodedata.east_asian_width(ch) in ('F', 'W', A''): #改了这行
                s += 2
            else:
                s += 1
        else:
            s += 1
    return s

[ 本帖最后由 satoru 于 2008-6-30 12:02 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP