1读写文件:
open打开文件,read读取的是str,读取之后需要解码为unicode,用decode()。
write()时,若参数为unicode,需要使用你希望写入的编码进行encode。如果是其他编码格式的str,需要先用该str的编码进行decode(),转换成unicode后再使用写入的编码进行encode()。
如果直接将unicode写入到文件,那么将使用源代码文件声明的字符编码进行编码然后写入
也就是说:写入到文件的必定是str,除非自己进行编解码,否则存入的编码是声明的编码方式
2 codecs
用指定的编码打开文件,文件读取返回的是:unicode。写入时:如果参数是unicode,则用open时指定的编码进行编码后写入;如果是str,则根据源代码文件声明的字符编码,解码成unicode再转换为open指定的编码进行编码后写入。
也就是说:写入的必定是str,而且str的编码方式是打开时所指定的编码方式
3建议
使用字符编码声明,所有源代码文件使用相同的字符编码声明
全部使用unicode
用codecs.open代替内置的open
避免使用MBCS/DBCS/utf-16
decodeearly:将文件中的内容转化成unicode再进行下一步处理
Unicodeeverywhere:程序内部处理用unicode
Encodelate:最护encode回所需要的encoding,例如把最终结果写进结果文件
明确函数中的输入参数和返回值的类型是什么
4python编码转换过程
原有编码->内部编码(unicode)->目的编码
Unicode:将所有语言统一到一套编码例,不会乱码,通常为2字节的可变字长编码。
英文:1个字节,汉字:3个字节,ascii编码可以看做是utf-8编码的一部分
Ascii:1个字节,255
在计算机中,统一使用unicode进行编码,需要传输或保存时,会转换为utf-8编码
记事本编辑过程:文件读取的utf-8字符被转换为unicode字符到内存里,保存的时候把unicode转换为utf-8
浏览网页过程:服务器把动态生成的内容转换为utf-8再传输到浏览器
\u4e2d:\u后面是十六进制的unicode码
5 python源代码
源代码也是文本文件,当源代码中包含中文时,需要指定保存为utf-8编码
6 u’’的作用
表示u后面的字符串是unicode字符串,python用unicode的机制进行处理,字符串操作时:会动用到内部的unicode处理函数,保存时以unicode字符保存,对于实际上不是unicode的字符串,做unicode动作处理会出问题。
u前缀只适用于你的字符串常亮真的是unicode
7 中文字符的IO操作
str:将字符串看做是字节的序列,基本单位更小
Unicode:看做是字符的序列
str->Unicode:decode,需要把字节序列解释成字符序列,字节序列是底层的存放方式,解码(decode)成更高层的字符以便使用
Unicode->str:encode,把字符序列编码为字节序列后进行存储
8 关于开头的几行代码
str实际是:byte数组,或者可以理解成一个纯ascii码字符组成的字符串
9 常见错误
UnicodeDecodeError:发生在str字符串解码为特定的unicode字符串。由于不同的编码只能映射部分str字符串到对应的unicode字符
Unicode函数是将一段string按照输入的编码转换成目标的编码,如果出现了与输入编码不相同的编码时,就会抛出UnicodeDecodeError异常
三种处理方法:strict,replace,ignore
strict:默认,直接抛出异常,通过register_error:可以有自己的处理方法
10 python中文处理流程
将欲处理的字符串用unicode函数以正确的编码转换为unicode->在程序中统一使用unicode字符串进行操作->输出时,用encode方法,将unicode转换为所需的编码
正确的编码:指定的编码和字符串本身的编码必须一致,输入中文可能有两种编码:GB2312(GBK,GB18030)或者UTF-8
encode为本地编码的时候,需要保证目标编码中存在欲转换字符的内码
11 总结
代码模块需要指定编码,默认为ascii,不支持中文
python2内部编码为unicode,可处理世界所有语言的字符,utf-8是unicode的实现形式
编码转换:其他的编码decode()为unicode,再编码encode()为你指定的编码,就不会乱码
网页处理:若代码用utf-8,网页为gbk,则需要这样处理:
html= html.decode(“gbk”).encode(“utf-8”)
unicode的汉字编码写到文件中:需要根据文本文件的编码进行转换,可以encode(“utf-8”)或者encode(“gbk”)
凡是报错信息中包含:”ASCII”,就是没有指定汉字编码