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

2013-04-27 16:28:51 +08:00
 spark
本来用到 textwrap.wrap(text, width=20) 这个方法, 纯中文和纯英文的都没问题, 但是中英混合字符串就不行.
原因就是中英文字符的lenth计算不一样, 求解.
9687 次点击
所在节点    Python
16 条回复
ljbha007
2013-04-27 16:34:46 +08:00
text = text.decode('utf-8')
将字符串转为unicode字符串 这样计数就如你的预期了
spark
2013-04-27 16:39:04 +08:00
这种方法不行哦, 中文算成一个字符了...

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

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

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

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

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

还是自己根据文字的unicode范围定制一个字长表(比如英文1, 中文2)写个textwrap吧
swulling
2013-04-27 17:34:42 +08:00
@spark 你这样直接写死20字节,会把汉子拆成两半的。。
spark
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
2013-04-27 19:15:55 +08:00
@spark
你到底是想要20个字符换行
还是英文字符 * 1 + 中文字符 * 2 = 20的时候换行?

如果是后一种情况 肯定会出现 汉字被分成两段的情况出现 结果就是那个字变成两个乱码
Yiner
2013-04-27 19:27:05 +08:00
变成unicode 然后判断是不是中文 中文算两个 英文算一个
lululau
2013-04-27 22:49:22 +08:00
楼主是想每N个单位换一行(一个汉字算两个单位)?那么你这个需求是不合逻辑的,因为一个汉字可能就被分到两行去了
for4
2013-04-28 00:49:52 +08:00
http://gist.github.com/anonymous/5473754
这样看下, 应该就知道要怎么做了吧?
Zuckonit
2013-04-28 17:37:49 +08:00
UTF-8.....
spark
2013-04-28 20:48:49 +08:00
已经解决了 感谢 回头贴代码

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/67183

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX