Chinaunix首页 | 论坛 | 博客
  • 博客访问: 287708
  • 博文数量: 163
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: -40
  • 用 户 组: 普通用户
  • 注册时间: 2017-03-08 00:28
文章分类

全部博文(163)

文章存档

2015年(2)

2014年(35)

2013年(28)

2012年(30)

2011年(22)

2010年(14)

2009年(8)

2008年(13)

2007年(11)

分类: Python/Ruby

2012-08-23 15:28:04

再次探究python脚本文件的编码问题,终于搞明白unicode和str,ansi和utf8、gbk的区别。

总是困扰在unicode和str,ansi和utf8、gbk的区别,明白了,一端时间又忘记了,很郁闷。。。按照自己理解很牵强的解释给自己,起码再也不用为encode、decode区别不清发愁了,娃哈哈 娃哈哈~~
ansi格式文件
对于脚本文件中使用了汉字等unicode字符。提示错误:
SyntaxError: Non-ASCII character '\xd6' in file E:\tt.py on line 7, but no encod
ing declared; see for details
解决方法:
1、转换为unicode格式编码(有BOM):可以通过,但是str格式的中文显示乱码,需要decode('gbk')
2、开头声明编码#coding=gbk

python系统内部是unicode的编码。unicode转化成str类型的,需要用encode,可以理解为加密成客户语言。decode就是把客户语言解密成python内部的明码(unicode)

ansi 是美国标准,8位只能存储256种符号。汉字太多没法存储,就用2个字节标识一个汉字。关键是他顺序存储,系统不知道第一个字节是字母呢还是一个汉字的一半。。。就需要指定编码格式。就是说str类型的,要指定编码格式才能让python内部正确认字。不然你搜索一个字,很可能是2个汉字的一半凑出来的。。。这个bug很搞,就像delphi里面用pos来找汉字会经常出现这种bug。。。

unicode是2位编码,够65535多字,比如文,中日韩都可以用。。。但是需要指明白一下,到底是那个国家,就有codepad(gbk)等需要指明一下了。。。

UTF-8是为了防止unicode一些字符在unix下面出现什么歧义,貌似处理了一下~~ 作为一个新语言处理好了。。。

举例说明:
x = u'中文',x是python内部存储:u'\u4e2d\u6587'。unicode世界字符都统一,所以不需要指定哪国语言。
y=' 中文'。那么y就是:'\xd6\xd0\xce\xc4'。属于ansi双字节编码格式,因为双字节储存格式太少,所以不能区分哪国文字,就需要在解密的时候指定出来,是哪国文字。而且位置也很重要,比如你把print '\xd0\xce',就打印出来"形"了。
因为y赋值的是中文,所以解密成python内部unicode的时候,就要指定"口令",y.decode('gbk'),这样就不会发生查找错误什么的bug了。


程序:===================
a = '中文'
b = u'中文'
print a, type(a)
print b, type(b)
print a.decode('gbk')
--------------------------------------
文件格式ansi
#coding=gbk
输出:
中文
中文
中文 ( print a.decode('gbk') )
--------------------------------------
文件格式utf8带bom
输出:
涓 枃
中文
中文 ( print a.decode('utf8') )
--------------------------------------

所以感觉还是用#coding=gbk的ansi格式的存储比较好

原文地址:
阅读(2016) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

hnynes2012-08-23 15:35:59

由于遇到了这个编码问题,看了这篇文章后,也没有想太多,把编码先转成utf8就可以正常工作了. 只是若原脚本文件中有中文时,需要注意,转换编码后,这些中文都不会正常显示了. 除非重新输入