免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7979 | 回复: 14
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-29 22:23 |只看该作者 |倒序浏览
大家好,
同样大小的中文字符的宽度是英文字符的双倍,
我想知道怎样可以在计算字串长度时使中文字符可以相当于两个单位的长度?

论坛徽章:
0
2 [报告]
发表于 2008-06-30 08:08 |只看该作者
本来不就是?

论坛徽章:
0
3 [报告]
发表于 2008-06-30 08:35 |只看该作者
转为gbk再算长度。

论坛徽章:
0
4 [报告]
发表于 2008-06-30 08:41 |只看该作者
对不起,我表述得不够清楚,可能漏了一些细节:
  我的源码是用utf-8编码,加了coding:utf-8,所以按照我的理解这里面对于我输入的每一个中文字串常量都会按照utf-8转换成对应的\u****
  在字串常量前加上u才使这里的\u变得有意义,但是在加上了u之后如果用len去计算字串的长度得到的则是一个汉字跟一个英文字母一样对应一个单位.
  我现在使用的方法是将字串encode('gbk'),然后再计算一个汉字的len就是2了,不过这似乎跟你的机器是32位还是64位有关,我至今没有很清楚的理解,T.T
  所以我希望在这里有知道怎么解决这个问题的前辈帮助我找到更好的解决方法.

论坛徽章:
0
5 [报告]
发表于 2008-06-30 08:49 |只看该作者

回复 #3 limodou 的帖子

谢谢limodou前辈,我现在用的就是这种方法,不过我以前看过一篇介绍python unicode的博客,里面好像说用类似我们这种方法得出的结果如果python解释器编译时是设成64位的话用len会返回4而不是2.
当然,可能大家会说你这里要求的已经是字符宽度单位,而不是长度了,为什么还要用len呢?
这是因为我看到在用str.center将字串居中时对中文的处理不好, 虽然我没看到center实现的代码,不过按照我的计算它是基于len一样的计算方法来确定前后各加多少填充字符的,所以当在显示时占两个宽度的中文字符出现时就会使这个算法失效.

论坛徽章:
0
6 [报告]
发表于 2008-06-30 09:28 |只看该作者
不会吧。与64位32位有关吗?你试过吗?

要么你试下这段代码:


  1. def string_width(text):
  2.     import unicodedata
  3.     s = 0
  4.     for ch in text:
  5.         if isinstance(ch, unicode):
  6.             if unicodedata.east_asian_width(ch) != 'Na':
  7.                 s += 2
  8.             else:
  9.                 s += 1
  10.         else:
  11.             s += 1
  12.     return s
复制代码


它需要传入unicode字符串。

[ 本帖最后由 limodou 于 2008-6-30 09:30 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-06-30 09:35 |只看该作者
路过

[ 本帖最后由 zhasm 于 2008-6-30 10:31 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-06-30 09:41 |只看该作者

回复 #6 limodou 的帖子

两三个月前看过的一篇文章,有可能是下面这篇.
http://boodebr.org/main/python/all-about-python-and-unicode
我还在学习中,现在连怎么设compile options都不会,呵呵,所以前辈如果发现有什么我误解了的地方希望前辈回帖给我讲一下,谢谢了

论坛徽章:
0
9 [报告]
发表于 2008-06-30 09:46 |只看该作者

回复 #7 zhasm 的帖子

lz要的是一个汉字当成两个字符,不是一个。如果是按一个算的话,可以先转为unicode再计算长度,不需要正则表达式。

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

回复 #8 satoru 的帖子

很长,不过上面没说什么32位64位的事吧。不过从字符集的范围来说gb18030好象有2万多个,两个字节最多也就65536,所以应该是表示不了的。但平时好象也没发现有特殊的情况。不行就用我上面写的函数试试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP