总是困扰在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格式的存储比较好