疯了疯了…… 'ascii' codec can't decode byte ……

1,121 views
Skip to first unread message

est

unread,
Feb 27, 2008, 12:56:38 PM2/27/08
to python-cn:CPyUG
弄了一个晚上,最终被Python+MySQL的编码搞崩溃了
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position
108: ordinal not in range(128)

我觉得python编码问题的主要原因是:
1. 默认的ascii不支持 \x128 - \x255 不可见字符的解析
2. 字串、unicode对象 和 byte array 三者的混淆(各种模块里标准不一样,造成兼容性问题)

我觉得这个问题应该这样解决:

1. 字符串类型仍然为sequence,但是一个字符串是一个unicode char,一个字符串对象可以有编码。但是一个中文和一个英文字母长度
都应该是1

2. 字符串和byte arrary区分开来。保证byte array不会出现编码问题

最后弱弱的问一下:在哪里可以修改ascii的codec?我准备把这个codec做个手术,把范围扩大到range(0, 255)

Jiahua Huang

unread,
Feb 27, 2008, 5:19:44 PM2/27/08
to pyth...@googlegroups.com
是你的问题。你自己混淆了 python2 里边的 str 和 unicode 数据类型。
你的解决思路也是错的。

请贴出问题代码


btw:
0.
你需要的是让编码用实际编码而不是 ascii

1.
对需要 str->unicode 的代码,可以在前边写上
import sys
reload(sys)
sys.setdefaultencoding('utf8')
把 str 编码由 ascii 改为 utf8 (或 gb18030)

2.
python3 区分了 unicode str 和 byte arrary,并且默认编码不再是 ascii


2008/2/28 est <electr...@gmail.com>:
> 弄了一个晚上,最终被Python+MySQL的编码搞崩溃了

Zoom.Quiet

unread,
Feb 27, 2008, 7:50:35 PM2/27/08
to pyth...@googlegroups.com
提醒你的DB模块提供控制MySQL 输出编码?
MySQL 4.0 之后对编码进行了加强,
如果你配置DB/表/字段的编码都是 utf-8 ,而且聲明以UTF-8 的编码进行连接,
基本上Py 操作,没有任何问题

2008/2/28 Jiahua Huang <jhuang...@gmail.com>:

--
'''Time is unimportant, only life important!
过程改进乃是开始催生可促生靠谱的人的组织!
'''http://zoomquiet.org
博 @ http://blog.zoomquiet.org/pyblosxom/
维 @ http://wiki.woodpecker.org.cn/moin/ZoomQuiet
豆 @ http://www.douban.com/people/zoomq/
看 @ http://zoomq.haokanbu.com/
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Pls. usage OOo to replace M$ Office. http://zh.openoffice.org
Pls. usage 7-zip to replace WinRAR/WinZip. http://7-zip.org
You can get the truely Freedom 4 software.

OnMyWay

unread,
Feb 27, 2008, 10:47:46 PM2/27/08
to pyth...@googlegroups.com
在postgresql上出现过类似问题,应该是数据库的编码问题。检查一下哪里可以设置client encoding.

在 08-2-28,Zoom. Quiet<zoom....@gmail.com> 写道:

est

unread,
Feb 28, 2008, 12:05:08 AM2/28/08
to python-cn:CPyUG
谢谢解答啊。


我的mysql服务器、表、python文件、代码内部编码都是用的utf-8。但是要写入的数据来源有点混乱,有gb2312的网页也有utf8的网
页……解析之后格式化字符串的时候一堆问题……

我已经搞定了,的确是str和unicode类型的混淆使用类型,统一encode一次就OK了。

非常期待py3k,希望能够解决编码问题

痛苦……

On 2月28日, 上午6时19分, "Jiahua Huang" <jhuangjia...@gmail.com> wrote:
> 是你的问题。你自己混淆了 python2 里边的 str 和 unicode 数据类型。
> 你的解决思路也是错的。
>
> 请贴出问题代码
>
> btw:
> 0.
> 你需要的是让编码用实际编码而不是 ascii
>
> 1.
> 对需要 str->unicode 的代码,可以在前边写上
> import sys
> reload(sys)
> sys.setdefaultencoding('utf8')
> 把 str 编码由 ascii 改为 utf8 (或 gb18030)
>
> 2.
> python3 区分了 unicode str 和 byte arrary,并且默认编码不再是 ascii
>
> 2008/2/28 est <electronix...@gmail.com>:
>
>
>
> > 弄了一个晚上,最终被Python+MySQL的编码搞崩溃了- 隐藏被引用文字 -
>
> - 显示引用的文字 -

yuting cui

unread,
Feb 28, 2008, 12:34:59 AM2/28/08
to pyth...@googlegroups.com
这种编码混乱出的错用什么都一样...
...不报错硬给你塞才是噩梦...最后用的时候才发现一堆乱码,还不知道哪里出的错

在 08-2-28,est<electr...@gmail.com> 写道:

jigloo

unread,
Feb 28, 2008, 1:27:08 AM2/28/08
to python-cn:CPyUG
到zhuaxia搜一下,有篇文章讲的py+mysql十分详细。

man lo

unread,
Feb 28, 2008, 1:41:50 AM2/28/08
to pyth...@googlegroups.com
这个解决应该还是很简单、、、、
 
首先看下你的数据库的编码格式。。。
 
如是UTF-8的   一般我的解决方法是 源文件 和数据库的编码要保持一致
 
然后对插入数据库中的中文出现问题的话  一般 decode某一编码 再encode成目标编码.....

 
在08-2-28,jigloo <ph...@live.com> 写道:
Reply all
Reply to author
Forward
0 new messages