文件编码
python的字符串类型:
字节字符串
unicode字符串
创建一个字节字符串
>>> s="zhangcong"
>>> type(s)
<type 'str'>
创建一个unicode字符串
>>> t=u"zhangcong"
>>> type(t)
<type 'unicode'>
>>> "s" is u"s"
False
>>>
文件的存储和编码
记事本编辑的时候读取时,先把utf-8转换为unicode,然后保存的时候再把unicode转换为utf-8
正常文件打印中文
文件保存为utf-8的编码格式
文件加encoding=utf-8
中文符号前面加‘u’
#encoding=utf-8
print u"中国!"
C:\Users\cong>python f:\\python\\0702\\3utf-8.txt
中国!
保存ansi时不加u正常显示
#encoding=utf-8
print "中国!"
C:\Users\cong>python f:\\python\\0702\\2ansi.txt
中国!
加u会报错
#encoding=utf-8
print u"中国!"
C:\Users\cong>python f:\\python\\0702\\2ansi.txt
File "f:\\python\\0702\\2ansi.txt", line 4
print u"中国!"
SyntaxError: (unicode error) 'utf8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
保存ansi时代码声明为gbk时加不加u都正常显示
raw_input中文乱码问题:
保存为utf-8格式时:
#encoding=utf-8
string=raw_input("请输入内容:".decode("utf-8").encode("gbk"))
priint string
C:\Users\cong>python d:\\2.txt
请输入内容:zw我们
zw我们
保存为ansi格式时
#encoding=utf-8
string=raw_input("请输入内容:")
print string
#这样就不会乱码
C:\Users\cong>python d:\\2.txt
请输入内容:张工
张工
读取文件的内容(文件中包含中文的)
程序文件一般保存的编码格式是utf-8,
如果读取的文件保存的是ansi格式就会读取出正确的内容
如果读取的文件保存的是utf-8格式 中文就会乱码
文件名字包含中文的
程序文件要保存为utf-8
1、#encoding=utf-8
2、打开文件时要加u
3、如果添加的中文不加u
#向中文名字文件中写入中文
test="测试"
f=open(u"d:\\张.txt","w")
f.write(test)
f.write("zhang")
f.close()
如果没有保存为utf-8的话执行时会报错
C:\Users\cong>python d:\\py\\从文件中读取中文.txt
File "d:\\py\\从文件中读取中文.txt", line 3
f=open(u"d:\\张.txt")
SyntaxError: (unicode error) 'utf8' codec can't decode byte 0xd5 in position 0:
invalid continuation byte
字符编码转化
先转化为unicode在转化为其他编码
encode加密 把unicode转化为其他编码,操作的对象必须是unicode
decode解密 把其他编码转化
1只要是str类型,只能调用decode方法,解码为uncode
2只要是unicode,只能调用encode方法,编码为str为unicode编码
对中文字符调用decode会报错
>>> u"zhong".decode("gbk")
u'zhong'
>>> u"中国".decode("gbk")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
>>>
字节字符串与unicode之间的转换
>>> s="zhangcong"
>>> type(s)
<type 'str'>
>>> u=s.decode() #把字节字符串转换为unicode
>>> u
u'zhangcong'
>>> type(u)
<type 'unicode'>
>>> u.encode() #把unicode转换为字节字符串
'zhangcong'
>>> v=u.encode()
>>> v
'zhangcong'
>>> type(v)
<type 'str'>
>>>
练习:
#声明一个中文unicode,然后编码为utf-8,写入文件中,看看文件的编码是啥
#encoding=utf-8
a=u"语文"
b=a.encode("utf-8")
f=open("f:\\11.txt","w")
f.write(b)
文件的编码为utf-8
#声明一个中文unicode,然后编码为gbk,写入文件中,看看文件的编码是啥
#encoding=utf-8
a=u"语文"
c=a.encode("gbk")
f=open("f:\\11.txt","w")
f.write(c)
文件的编码为ansi
#声明一个中文unicode字符串,然后编码为utf-8写入文件中,然后编码为gbk写入文件中,看看文件的编码是什么。
#encoding=utf-8
a=u"语文"
b=a.encode("utf-8")
c=a.encode("gbk")
f=open("f:\\11.txt","w")
f.write(b)
f.write(c)
文件编码为ansi
Unicode-----utf-8----unicode------gbk-----unicode
#encoding=utf-8
a=u"中国"
print type(a)
print a
--------------------
<type 'unicode'>
中国
-------------------
print "*"*20
print u"unicode转utf-8"
a=a.encode("utf-8")
print type(a)
print a
********************
unicode转utf-8
<type 'str'> #因为cmd下只支持unicode和gbk编码,所以utf-8编码的会乱码
涓浗
------------------------------
print "*"*20
print u"utf-8转unicode"
a=a.decode("utf-8")
print type(a)
print a
********************
utf-8转unicode
<type 'unicode'>
中国
-----------------------------
print "*"*20
print u"unicode转gbk"
a=a.encode("gbk")
print type(a)
print a
********************
unicode转gbk
<type 'str'>
中国
--------------------------------
print "*"*20
print u"gbk转unicode"
a=a.decode("gbk")
print type(a)
print a
********************
gbk转unicode
<type 'unicode'>
中国