Chinaunix首页 | 论坛 | 博客
  • 博客访问: 174606
  • 博文数量: 39
  • 博客积分: 929
  • 博客等级: 准尉
  • 技术积分: 500
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-06 11:16
个人简介

文章分类

全部博文(39)

文章存档

2013年(3)

2012年(28)

2011年(8)

我的朋友

分类: 系统运维

2011-09-15 10:08:12

如果一次遇到:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 这样的错误,然后到网上找找解决方案可以接受,如果多次遇到这样的问题,那就是自己的问题了。
web开发,数据从各处(如果不明确encode)收集到业务层(指明是utf8)处理,往往会有因各个源字符集不同导致处理失败的情况,就比如上面这个错误。
到网上一看,python字符集的处理大家一致感觉还是挺麻烦的,还是先来看看 .现在要关心的还是该如何正确转换中文和UTF8,解决开始的问题。
gb2312  |
gbk     |    unicode
big5    |
...     |
       utf8   

gb2312,gbk,big5等要转换为utf8,则要先到(decode)unicode,再到(encode)utf8:

C1 0 1 2 3 4 6 7 8 9 A B C D E F
A   痢 立 粒 沥 隶 力 璃 哩 俩 联 莲 连 镰 廉 怜
B 涟 帘 敛 脸 链 恋 炼 练 粮 凉 梁 粱 良 两 辆 量
C 晾 亮 谅 撩 聊 僚 疗 燎 寥 辽 潦 了 撂 镣 廖 料
D 列 裂 烈 劣 猎 琳 林 磷 霖 临 邻 鳞 淋 凛 赁 吝
E 拎 玲 菱 零 龄 铃 伶 羚 凌 灵 陵 岭 领 另 令 溜
琉 榴 硫 馏 留 瘤 流 柳 六 龙 聋 咙 笼 窿
查gbk表知汉字“刘”的gbk码是'\xc1\xf5',首先用decode到unicode:
>>> '\xc1\xf5'.decode('gbk')
u'\u5218'
再由unicode到utf8:
>>> u'\u5218'.encode('utf8')
'\xe5\x88\x98'    ->1
>>>
在utf8为默认的系统上看看“刘”的utf8:
>>> "刘"
'\xe5\x88\x98'    ->2
和1对得上,再来看看在gbk为默认的系统上看看“刘”的gbk:
>>> "刘"
'\xc1\xf5'
>>>
其他的也就类似了,知道了这个关系后,字符串编码的转换就不再难做了。
回到开头的问题,'ascii' codec can't decode byte 0xe6,说明ascii不认识0xe6...
encode:
decode:
==over==


以前把utf8的分类搞错了好像,现在认为utf8和gb2312,gbk,big5是同等的位置。

>>> '刘'.decode('gbk') 用gbk解压成unicode
u'\u5218'
>>> '刘'.decode('gb2312')用gb2312解压成unicode
u'\u5218'
>>> '刘'.decode('gb2312').encode('utf-8')用gb2312解压成unicode,再压缩成utf-8
'\xe5\x88\x98'
>>> '刘'.decode('gb2312').encode('gb2312')用gb2312解压成unicode,再压缩成gb2312
'\xc1\xf5'
>>> '刘'.decode('gb2312').encode('gbk')用gb2312解压成unicode,再压缩成gbk
'\xc1\xf5'
>>> repr('刘') 刘的gb2312/gbk表示
"'\\xc1\\xf5'"
>>>
==over==





阅读(10820) | 评论(0) | 转发(0) |
0

上一篇:IE 缓存

下一篇:django safe 过滤器

给主人留下些什么吧!~~