python3编码相关

on under python
1 minute read

0x01 byte string 和 character string

1>byte string是如01010110110010的序列,计算机可读,人不可读
2>character string是如"您好,world"的序列,计算机不可读,人可读
3>character string要encode("eg.utf8|cp1252")之后才可被计算机认识和存储
4>文件存储时实际上是byte string,要想读出这个byte string对应的character string则要以文件在存储时的编码方式解码[decode]之后才会显示成人可读的character string
5>猜测python3中的open函数默认用utf8解码文件,这样的话在python3想要读其他编码方式存储的文件的时候直接用open函数就
会出错

eg.python3读以cp1252编码存储的文件

import sys
import codecs
import re
count=0
i=0
with codecs.open(sys.argv[1], "r",encoding='cp1252', errors='replace') as f:
    for each in f:
        if re.search(r"Insert into",each):
            count+=1
            sys.stdout.write("一共有"+str(count)+"条数据\r")
            sys.stdout.flush()
        print(type(each))
print("\n")
上面的python代码中用来读取以cp1252编码的文件中有多少条Insert into的语句,如果其中换成是下面的打开方式会出错
	with open(sys.argv[1],"r+") as f:
正确打开方式中的encoding='cp1252'应该理解成"这个文件是用cp1252的编码方式encode之后存储的byte string,现在告诉计算机,计算机
在读取的时候会以cp1252来decode成人可读的character string",在上面的正则匹配时,r"Insert into"表示的是character
string类型的Insert into字符串,each表示的是被open解码后的也正好是character类型的字符串,正则在匹配时要求匹配的表
达式和被匹配的字符串是同一类型,如果在这里将r"Insert into"改成b"Insert into"则会报错,提示两个参数不是同一类型,上
面的正则中的r"Insert into"也可以不写r前缀,在匹配\n[换行符]时,r"\n"表示的不是换行符,是\n字符串,如果要匹配\n换行
符,则要写成"\n",不能加r前缀,加了r前缀表示r修饰的要匹配的字符串中的转义字符不会被转义,代表raw[原生]

如果用上面说的错误的打开方式open文件,得到的是默认被utf8解码成的character string类型的字符串,但是一般会出错,因为有
些会无法用utf8解码成功

猜测print函数在打印变量时会默认用utf8解码要打印的变量,并显示成人可读的character string,不过会提示这个显示出来的
人可读的character string其实不是真的character string,例如打印byte string时会显示b"xxx...",表示这个是个byte
string,只是为了要让人更明白这个byte string代表的是什么才这样

0x01 python3正则匹配中文

import re
string="Hello,World! 你好世界"
if re.search("你好.*",string):
    print("good,matched")
else:
    print("bad,no matched")

0x02 knowledge

1.文件编码识别
	pip3 install chardet
	chardet file
2.ascii,unicode,utf8...
	http://blog.csdn.net/xiongxiao/article/details/3741731
codec, python
home
github
archive
category