V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
spark
V2EX  ›  Python

Python处理中英文混合字符串, 每20个字符换一行, 应该如何计算呢?

  •  
  •   spark · 2013-04-27 16:28:51 +08:00 · 9462 次点击
    这是一个创建于 4010 天前的主题,其中的信息可能已经有所发展或是发生改变。
    本来用到 textwrap.wrap(text, width=20) 这个方法, 纯中文和纯英文的都没问题, 但是中英混合字符串就不行.
    原因就是中英文字符的lenth计算不一样, 求解.
    16 条回复    1970-01-01 08:00:00 +08:00
    ljbha007
        1
    ljbha007  
       2013-04-27 16:34:46 +08:00
    text = text.decode('utf-8')
    将字符串转为unicode字符串 这样计数就如你的预期了
    spark
        2
    spark  
    OP
       2013-04-27 16:39:04 +08:00   ❤️ 1
    这种方法不行哦, 中文算成一个字符了...

    默认编码: utf-8
    Python版本: 2.7.4

    >>> msg = "中文123"
    >>> msg = msg.decode('utf-8')
    >>> len(msg)
    5
    swulling
        3
    swulling  
       2013-04-27 16:47:22 +08:00
    @spark 用gbk编码:msg.decode('utf-8').encode('gbk')

    因为在gbk里,中文是2个字符
    spark
        4
    spark  
    OP
       2013-04-27 17:13:35 +08:00
    swulling
        5
    swulling  
       2013-04-27 17:17:02 +08:00
    @spark 你这个例子和2楼不一样,msg一个是unicode,一个是utf8

    当然会报错
    swulling
        6
    swulling  
       2013-04-27 17:17:55 +08:00
    @spark 只有在你理解给字符串前面加u""代表了什么,你再去加。。
    spark
        7
    spark  
    OP
       2013-04-27 17:20:36 +08:00
    @swulling 我是在尝试不加u""之前报错, 才加上去的, 两种方法都报错... - -|||
    Js
        8
    Js  
       2013-04-27 17:28:59 +08:00
    简单的按字节算肯定会出现一个字一半在上一行, 一半在下一行的bug

    按字算才是对的, 出现上下行宽度不一样归根到底是字体宽度问题

    还是自己根据文字的unicode范围定制一个字长表(比如英文1, 中文2)写个textwrap吧
    swulling
        9
    swulling  
       2013-04-27 17:34:42 +08:00
    @spark 你这样直接写死20字节,会把汉子拆成两半的。。
    spark
        10
    spark  
    OP
       2013-04-27 17:53:23 +08:00
    @swulling 我把msg中多余的空格手动删掉了, 然后就好用了... 我猜可能是我复制到了看不到的换行符, 在中文部分加入隐藏的换行或者\n, gbk理解不了.

    那么, 新的问题又来了, 我如果想在msg中加入换行应该怎么做呢? 我在中文部分加入\n或\r会报错, 在英文部分加入又只会显示空格.

    <script src="https://gist.github.com/yandongxu/5472551.js"></script>
    ljbha007
        11
    ljbha007  
       2013-04-27 19:15:55 +08:00
    @spark
    你到底是想要20个字符换行
    还是英文字符 * 1 + 中文字符 * 2 = 20的时候换行?

    如果是后一种情况 肯定会出现 汉字被分成两段的情况出现 结果就是那个字变成两个乱码
    Yiner
        12
    Yiner  
       2013-04-27 19:27:05 +08:00
    变成unicode 然后判断是不是中文 中文算两个 英文算一个
    lululau
        13
    lululau  
       2013-04-27 22:49:22 +08:00
    楼主是想每N个单位换一行(一个汉字算两个单位)?那么你这个需求是不合逻辑的,因为一个汉字可能就被分到两行去了
    for4
        14
    for4  
       2013-04-28 00:49:52 +08:00
    http://gist.github.com/anonymous/5473754
    这样看下, 应该就知道要怎么做了吧?
    Zuckonit
        15
    Zuckonit  
       2013-04-28 17:37:49 +08:00
    UTF-8.....
    spark
        16
    spark  
    OP
       2013-04-28 20:48:49 +08:00 via iPhone
    已经解决了 感谢 回头贴代码
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   869 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:52 · PVG 05:52 · LAX 14:52 · JFK 17:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.