如何计算中文字串长度

如何计算中文字串长度

大家好,
同样大小的中文字符的宽度是英文字符的双倍,
我想知道怎样可以在计算字串长度时使中文字符可以相当于两个单位的长度?
本来不就是?
转为gbk再算长度。
对不起,我表述得不够清楚,可能漏了一些细节:
  我的源码是用utf-8编码,加了coding:utf-8,所以按照我的理解这里面对于我输入的每一个中文字串常量都会按照utf-8转换成对应的\u****
  在字串常量前加上u才使这里的\u变得有意义,但是在加上了u之后如果用len去计算字串的长度得到的则是一个汉字跟一个英文字母一样对应一个单位.
  我现在使用的方法是将字串encode('gbk'),然后再计算一个汉字的len就是2了,不过这似乎跟你的机器是32位还是64位有关,我至今没有很清楚的理解,T.T
  所以我希望在这里有知道怎么解决这个问题的前辈帮助我找到更好的解决方法.
谢谢limodou前辈,我现在用的就是这种方法,不过我以前看过一篇介绍python unicode的博客,里面好像说用类似我们这种方法得出的结果如果python解释器编译时是设成64位的话用len会返回4而不是2.
当然,可能大家会说你这里要求的已经是字符宽度单位,而不是长度了,为什么还要用len呢?
这是因为我看到在用str.center将字串居中时对中文的处理不好, 虽然我没看到center实现的代码,不过按照我的计算它是基于len一样的计算方法来确定前后各加多少填充字符的,所以当在显示时占两个宽度的中文字符出现时就会使这个算法失效.
不会吧。与64位32位有关吗?你试过吗?

要么你试下这段代码:

[Copy to clipboard] [ - ]
CODE:
def string_width(text):
    import unicodedata
    s = 0
    for ch in text:
        if isinstance(ch, unicode):
            if unicodedata.east_asian_width(ch) != 'Na':
                s += 2
            else:
                s += 1
        else:
            s += 1
    return s

它需要传入unicode字符串。

路过

两三个月前看过的一篇文章,有可能是下面这篇.
http://boodebr.org/main/python/all-about-python-and-unicode
我还在学习中,现在连怎么设compile options都不会,呵呵,所以前辈如果发现有什么我误解了的地方希望前辈回帖给我讲一下,谢谢了
lz要的是一个汉字当成两个字符,不是一个。如果是按一个算的话,可以先转为unicode再计算长度,不需要正则表达式。
很长,不过上面没说什么32位64位的事吧。不过从字符集的范围来说gb18030好象有2万多个,两个字节最多也就65536,所以应该是表示不了的。但平时好象也没发现有特殊的情况。不行就用我上面写的函数试试。