[高手请进] 关于python源文件编码声明和源文件编码格式的作用分析

kiki113 2009-04-11 02:06:50
在以下四个py文件,源代码都是:
if __name__ == '__main__':
str1 = '哈哈'
str2 = u'哈哈'
print 'str1:repr(str1):%s' % repr(str1)
print 'str1:%s' % str1
print 'str1:repr(str2):%s' % repr(str2)
print 'str2:%s' % str2
将这段代码存为以下四个文件:
gbk_bgk.py:源文件编码格式和编码声明都为GBK
gbk_utf8.py:源文件编码格式为GBK,编码声明为UTF-8
utf8_gbk.py:源文件编码格式为UTF-8,编码声明为GBK
utf8_utf8.py:源文件编码格式和编码声明都为:UTF-8
运行这四个文件结果如下:
D:\Test>gbk_bgk.py
str1:repr(str1):'\xb9\xfe\xb9\xfe'
str1:哈哈
str1:repr(str2):u'\u54c8\u54c8'
str2:哈哈

D:\Test>gbk_utf8.py
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb9 in position 0: unexpected code byte

D:\Test>utf8_gbk.py
str1:repr(str1):'\xe5\x93\x88\xe5\x93\x88'
str1:鍝堝搱
str2,code:[u'\u935d\u581d\u6431']
str2:repr(str2):u'\u935d\u581d\u6431'
str2:鍝堝搱

D:\Test>utf8_utf8.py
str1:repr(str1):'\xe5\x93\x88\xe5\x93\x88'
str1:鍝堝搱
str1:repr(str2):u'\u54c8\u54c8'
str2:哈哈

为什么结果会是这样呢?其是‘哈‘字的在各编码格式下面的编码如下:
Unicode:C854
UTF-8:E59388
GBK:B9FE

四个文件和结果可以在从附件中下载。
...全文
743 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawnstar3 2009-09-01
  • 打赏
  • 举报
回复
http://hi.baidu.com/jasonlyy/blog/item/0caa3a03b04c5e077bec2ca6.html
可以看看这篇文章,讲解比较深入
DarkChampion 2009-08-29
  • 打赏
  • 举报
回复
受教了
DarkChampion 2009-08-29
  • 打赏
  • 举报
回复
我今天正好在看这个问题
axolo 2009-08-29
  • 打赏
  • 举报
回复
duzif 2009-04-13
  • 打赏
  • 举报
回复
学习了,谢谢楼主

乱码的一个根源就在于:byte->char 和 char->byte
kiki113 2009-04-11
  • 打赏
  • 举报
回复
以下是我对这个问题的理解,欢迎大家拍砖:
gbk_bgk.py和utf8_utf8.py的结果比较好理解
因为我是在windows下面运行,控制台的默认编码是cp936
当我运行 gbk_bgk.py 时,
str1 = '哈哈'
print 'str1:%s' % str1
str1值为:'\xb9\xfe\xb9\xfe'
cp936可以很好的将其解析为‘哈哈’,所以输出就是中文‘哈哈’
同样当运行
str2 = u'哈哈'
print 'str2:%s' % str2时,
str2为unicode编码
而print语句处理unicode编码时,会先将转成cp936,所以也可以很好的输出

而在运行utf8_utf8.py时
由于 str1 = '\xe5\x93\x88\xe5\x93\x88'
而这串编码值通过cp936解析时,显示的就是'鍝堝搱 ',看着就像乱码
当输出str2时,理由同gbk_bgk.py分析

至于gbk_utf8.py、utf8_gbk.py就有点麻烦了,篇幅比较长,我就不引用了,可以看看
http://blog.csdn.net/kiki113/archive/2009/04/10/4062063.aspx

欢迎大家讨论,看看我的分析是否正确,大家一起努力弄清楚中文乱码问题

37,741

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧