作为一个初学者,在实践过程中会碰到很多的问题,在不断的解决问题中壮大自己是驱动我学习的动力。
今天用python 2.7.11,自带的IDLE编了一些代码,但是发现无法保存,后来查阅很多资料发现原来需要在代码的开始加上 # -*- coding:utf-8 -*- 这个命令行。
根据网上的说法,在# -*- coding:utf-8 -*- 是为了在处理IDLE中的中文字符不出错。如果代码中含有中文字符 需要通过utf-8这个格式处理,否则系统默认为ACSII编码。
貌似 python3.X的版本不用这个声明
另外,程序中中文乱码的处理方法(网上收集):
程序中有 打印中文的命令时,如果输出的为乱码,可以在程序的开始阶段输入声明:
# -*- coding: cp936 -*-
或者
方法一:
在文件的开头加入编码声明:
#coding = gbk
s = '谷歌'
print s
输出结果:谷歌
方法二:
在输出时进行转码:
#coding = utf-8
s = '谷歌'
print unicode(s,'gbk')
输出结果:谷歌
txt文件中文乱码处理
某些软件,如notepad,在保存一个以utf-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xef 0xbb 0xbf,即bom)。因此我们在读取时需要自己去掉这些字符,python中的codecs module定义了这个常量
# coding=gbk
import codecs
data = open("test.txt").read()
if data[:3] == codecs.bom_utf8:
datadata = data[3:]
print data.decode("utf-8")
用unicode函数和decode方法把str转换成unicode。为什么这两个函数的参数用"gbk"呢?
第一反应是我们的编码声明里用了gbk(# coding=gbk),但真是这样?
修改一下源文件:
# coding=utf-8
s = "中文"
print unicode(s, "utf-8")
运行,报错:
traceback (most recent call last):
file "chinesetest.py", line 3, in <module>
s = unicode(s, "utf-8")
unicodedecodeerror: 'utf8' codec can't decode bytes in position 0-1: invalid data
显然,如果前面正常是因为两边都使用了gbk,那么这里我保持了两边utf-8一致,也应该正常,不至于报错。
更进一步的例子,如果我们这里转换仍然用gbk:
# coding=utf-8
s = "中文"
print unicode(s, "gbk")
结果:中文