烦人的python编码

sdem 2009-05-08
先说print的问题。请比较3和2.6的区别。直说吧,在2.6中,print ('aa', 'bb'),是输出一个tuple,而不是一个字符串。

Python 3.0.1 (r301:69561, Feb 13 2009, 20:04:18) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print('aa','bb')
aa bb
>>>

Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print ('aa', 'bb')
('aa', 'bb')
>>>

sdem 2009-05-08
xiaobin268 写道
sdem 写道
如果LZ贴出所谓的“乱码”,80%以上的人都能告诉你错在哪里了。哈哈。

好吧,我贴出来。声明一下,我的代码头部已经加上了#coding=gbk
,('line---->', '   \xc4\xe3\xba\xc3\n').


先说第一个问题,#coding=gbk。

你可以试一试,没有#coding=gbk的情况,脚本文件中不要有非ASCII字符。

filename = raw_input('please enter file name:')   
f = open(filename)   
for line in f:
    print ('line---->', line)   
f.close()   


现在无论你读入的文件是什么编码,你都可以用这个文件打印了。
sdem 2009-05-08
xiaobin268 写道
sdem 写道
如果LZ贴出所谓的“乱码”,80%以上的人都能告诉你错在哪里了。哈哈。

好吧,我贴出来。声明一下,我的代码头部已经加上了#coding=gbk
,('line---->', '   \xc4\xe3\xba\xc3\n').


再来说说第二个问题,就是编码的问题,这几乎是月经帖了。

Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> line = '\xc4\xe3\xba\xc3' #gbk 编码
>>> print line
你好
>>> u = line.decode('gbk') #unicode 编码
>>> u
u'\u4f60\u597d' 
>>> print u
你好
>>> gbk = u.encode('gbk') #回到GBK编码
>>> gbk
'\xc4\xe3\xba\xc3'
>>> print gbk
你好
>>> u8 = u.encode('utf-8') #utf-8编码
>>> u8
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print u8 #这才是真正的乱码
浣犲ソ
>>>

而是否出现乱码的原因,是由操作系统,更具体点说,是你支持你的print语句的终端程序决定的。比如,打印utf-8在Windows的cmd下,是乱码,在windows的UltraEdit下,打印可能不是乱码。
sdem 2009-05-08
结论。

一、编码说明。编码说明是说明脚本文件本身的。如果你的脚本文件本身使用了非ASCII码,你应该在文件开头说明。如# -*- coding:gbk -*-  

二、打印字符串,不能加括号。print('line----> ',line)打印的元组,而不是字符串。当然3.0以后的print语句不在此列。

三、编码转换。
如果文件的编码是GBK,你操作的终端也是支持GBK的,你不需要转换。
如果文件的编码是UTF8,而你操作的终端只支持GBK,不支持UTF8,你需转码。
转码方式如下:
>>> utf8 = '\xe4\xbd\xa0\xe5\xa5\xbd' #请比较楼上注意这是UTF8编码
>>> print utf8.decode('UTF8').encode('GBK')
你好
>>>
xiaobin268 2009-05-08
sdem 写道
结论。

一、编码说明。编码说明是说明脚本文件本身的。如果你的脚本文件本身使用了非ASCII码,你应该在文件开头说明。如# -*- coding:gbk -*-  

二、打印字符串,不能加括号。print('line----> ',line)打印的元组,而不是字符串。当然3.0以后的print语句不在此列。

三、编码转换。
如果文件的编码是GBK,你操作的终端也是支持GBK的,你不需要转换。
如果文件的编码是UTF8,而你操作的终端只支持GBK,不支持UTF8,你需转码。
转码方式如下:
>>> utf8 = '\xe4\xbd\xa0\xe5\xa5\xbd' #请比较楼上注意这是UTF8编码
>>> print utf8.decode('UTF8').encode('GBK')
你好
>>>

非常好,真是谢谢你了。
Global site tag (gtag.js) - Google Analytics