您的位置:首页 > 编程语言 > Python开发

手把手教你:python字符串编码详解

2015-07-12 18:02 603 查看
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”,就是没有指定汉字编码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: