有一个地方要注意,
编码和文件种类是两个概念
文件开始的字节
文件格式大概有四类,分别对应notepad++encoding列表的四个
它们的区别是文件开头的字节
utf 8 | 空 |
---|---|
utf 8 bom | \xef\xbb\xbf |
unicode be | \xfe\xff |
unicode le | \xfe\xff |
编码
还有一点是unicode 和gbk是重合的。
unicode 是定长的(任何字符都是两字节,python中一个字的长度是1
,尽管实际上占了2字节,len("我是猪")==3
,以及源码文件是unicode编码的。
unicode 相关的其他还没有弄明白。
测试代码
测试代码先放在这里:
# -*- coding: utf-8 -*-
f=open("unicode.txt","w")
f.write("我是猪")
f.close()
f=open("gbk.txt","w",encoding='gbk')
f.write("我是猪")
f.close()
f=open("utf8.txt","w",encoding='utf-8')
f.write("我是猪")
f.close()
print("only test: ")
print("我是猪".encode())
print("我是猪".encode("utf-8"))
print("我是猪".encode("gbk"))
print(len("我是猪"))
print(len("我是猪123"))
print(len(u"我是猪"))
print(len(u"我是猪123"))
print("000我是猪".encode())
print("000我是猪".encode("utf-8"))
print("000我是猪".encode("gbk"))
print("unicode")
f=open("unicode.txt","rb")
x=f.read()
print(x,x.decode("gbk"))
f.close()
print("utf8 bom")
f=open("utf8bom.txt","rb")
x1=f.read()
print(x1,x1.decode())
f.close()
print("unicode be")
f=open("unicode_be.txt","rb")
x2=f.read()
print(len(x2),x2)
f.close()
print("unicode le")
f=open("unicode_le.txt","rb")
x3=f.read()
print(len(x3),x3)
f.close()
f=open("utf8.txt","r",encoding="utf-8")
print(f.read())
f.close()
f=open("utf8bom.txt","r",encoding="utf-8")
print(f.read())
f.close()
f=open("unicode.txt","r")
print(f.read())
f.close()
f=open("unicode_be.txt","r",encoding="gbk")
#print(f.read())#?????
f.close()
f=open("unicode_le.txt","r",encoding="gbk")
#print(f.read())#?????
f.close()