我以为我不会被 python 的编码折磨了, 看来我还是太嫩了, 大家帮我看看这个问题吧,谢谢了

2014-05-13 10:53:06 +08:00
 geew
In [43]: '%s-%s' % ('中国', u'2323')
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
/home/gowin/yunfan/Kuaibi/gateway/<ipython-input-43-816b251553ea> in <module>()
----> 1 '%s-%s' % ('中国', u'2323')

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

In [44]: '%s-%s' % (u'中国', '2323')
Out[44]: u'\u4e2d\u56fd-2323'

In [45]: '%s-%s' % ('中国', '2323')
Out[45]: '\xe4\xb8\xad\xe5\x9b\xbd-2323'

In [46]: '%s-%s' % (u'中国', u'2323')
Out[46]: u'\u4e2d\u56fd-2323'


为毛第一个会报错呢??
PS: 遇到这类型的问题怎么做才是最佳的解决方案呢? 就是不知道你的字符串是什么编码,然后你要做连接操作.
3656 次点击
所在节点    问与答
14 条回复
skydiver
2014-05-13 10:59:24 +08:00
报错是因为中文没法用ascii解码

所以必须指定是unicode,或者用python3吧
duzhe0
2014-05-13 11:14:16 +08:00
源代码用utf-8编码,并且在文件第二行加上:
# -*- coding: utf-8 -*-
duzhe0
2014-05-13 11:16:59 +08:00
不好意思, 我发的解决不了问题
loading
2014-05-13 11:22:28 +08:00
先检测出编码,再连接!
yxjxx
2014-05-13 11:27:35 +08:00
遇到过类似问题,写过一篇简单的总结. http://yxjxx.me/basic-character-encoding 适用于python2
Ever
2014-05-13 11:31:44 +08:00
省u加from __future__ import unicode_literals
不然除了英文数字符号统统加u
aurorawu
2014-05-13 11:42:02 +08:00
In [43]: '%s-%s' % ('中国', u'2323')
'' + u'' == u'' 这里是中文(字节)转成unicode(字符) 所以decode 但是中文用ascii解码会报错 @skydiver +1
Sylv
2014-05-13 11:49:45 +08:00
第一个报错是因为有一个参数 u'2323' 是 Unicode,所以在格式化字符串的时候会将所有 String 都转换为 Unicode 输出,而 Python2 默认编码是 ascii,用 ascii 编码转换 String 类型的 '中国' 时就出错了,需要用 utf-8 编码才不会出问题:'中国'.decode('utf-8')。
第二个没问题是因为 u'中国'已经是 Unicode 了就不用转换了,而 '2323' 是可以用默认的 ascii 编码转换成 Unicode 的,所以不会出错。
第三个是因为所有参数都是 String 类型的,那么格式化后输出的也是 String 类型,没有涉及到编码转换,所以没有问题。

曾经也被 Python2 的编码坑了很多次,我后来的经验是:代码里所有写的字符串不管中英文都在前面加u,处理为 Unicode;然后所有输入都 decode 为 Unicode,内部处理全用 Unicode,输出时再 encode 为 String。这样可以尽量避免编码出错,以后也更好迁移到 Python3。
walleL
2014-05-13 12:44:42 +08:00
@Sylv
geew
2014-05-13 13:02:08 +08:00
@Sylv 谢谢 总算了解了
geew
2014-05-13 13:14:09 +08:00
@Sylv 但是还有一个疑问就是, 如果你不知道输入到程序里面的字符串是unicode还是string呢? 或者你知道输入的是unicode但你不知道是用什么编码方式decode的呢?
Sylv
2014-05-14 03:57:04 +08:00
@geew 不知道的话应该就只能先测试下或检测下了 好像没有什么万能的方法
geew
2014-05-14 09:55:19 +08:00
@Sylv 是啊 我也只是尝试编码 然后捕捉异常
gladuo
2015-03-29 02:10:31 +08:00
@Sylv 有些库只能接str。。。
感觉好蛋疼

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

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

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

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

© 2021 V2EX