python函数——编码问题——str与Unicode的区别
来源:互联网 发布:mac双硬盘安装双系统 编辑:程序博客网 时间:2024/06/05 19:31
一篇关于STR和UNICODE的好文章
整理下python编码相关的内容
注意: 以下讨论为Python2.x版本, Py3k的待尝试
开始
用python处理中文时,读取文件或消息,http参数等等,一运行,发现乱码(字符串处理,读写文件,print),然后,大多数人的做法是,调用encode/decode进行调试,并没有明确思考为何出现乱码,所以调试时最常出现的错误:
错误1:
错误2
首先
必须有大体概念,了解下字符集,字符编码、ASCII | Unicode | UTF-8 | 等等
字符编码笔记:ASCII,Unicode和UTF-8
淘宝搜索技术博客-中文编码杂谈
gbk和unicode
gbk和unicode互化:
str 和 unicode
str和unicode都是basestring的子类,所以有判断是否是字符串的方法:
str和unicode 转换
decode 文档
encode 文档
str.decode("coding"):解码,将其他编码对应的字符串解码成coding形式的字符串。
str.encode("coding"):编码,将unicode编码转换为另一种为coding形式的编码,str需要为unicode编码。
区别:str是字节串,由unicode经过编码(encode)后的字节组成的
声明方式
求长度(返回字节数)
unicode才是真正意义上的字符串,由字符组成声明方式
求长度(返回字符数),在逻辑中真正想要用的
结论
搞明白要处理的是str还是unicode, 使用对的处理方法(str.decode/unicode.encode)下面是判断是否为unicode/str的方法
简单原则:不要对str使用encode,不要对unicode使用decode (事实上可以对str进行encode的,具体见最后,为了保证简单,不建议)
不同编码转换,使用unicode作为中间编码
文件处理,IDE和控制台
处理流程,可以这么使用,把python看做一个水池,一个入口,一个出口,入口处,全部转成unicode, 池里全部使用unicode处理,出口处,再转成目标编码(当然,有例外,处理逻辑中要用到具体编码的情况),过程:
- 读文件
- 外部输入编码,decode转成unicode
- 处理(内部编码,统一unicode)
- encode转成需要的目标编码
- 写到目标输出(文件或控制台)
IDE和控制台报错,原因是print时,编码和IDE自身编码不一致导致
输出时将编码转换成一致的就可以正常输出
建议
规范编码,统一编码,防止由于某个环节产生的乱码,环境编码,IDE/文本编辑器, 文件编码,数据库数据表编码,保证代码源文件编码。这个很重要,py文件默认编码是ASCII, 在源代码文件中,如果用到非ASCII字符,需要在文件头部进行编码声明 文档
不声明的话,输入非ASCII会遇到的错误,必须放在文件第一行或第二行
声明方法
若头部声明coding=utf-8, a = ‘中文‘ 其编码为utf-8
若头部声明coding=gb2312, a = ‘中文‘ 其编码为gbk
so, 同一项目中所有源文件头部统一一个编码,并且声明的编码要和源文件保存的编码一致(编辑器相关),在源代码用作处理的硬编码字符串,统一用unicode,将其类型和源文件本身的编码隔离开, 独立无依赖方便流程中各个位置处理
以上几步搞定后,你只需要关注两个 unicode和 你设定的编码(一般使用utf-8)
处理顺序
- Decode early
- Unicode everywhere
- Encode later
相关模块及一些方法
获得和设置系统默认编码
在python中,直接将某种编码的str进行encode成另一种编码str
‘获得和设置系统默认编码‘和这里的str.encode是相关的,但我一般很少这么用,主要是觉得复杂不可控,还是输入明确decode,输出明确encode来得简单些(个人观点)chardet
文件编码检测,下载
\u字符串转对应unicode字符串
python unicode文档:入口
- python函数——编码问题——str与Unicode的区别
- python函数——编码问题——str与Unicode的区别
- python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode 分类: python
- python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode
- python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode
- python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode
- python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode
- python的str和unicode以及编码的问题
- Python 中的 str 与 unicode 编码处理
- Python——str字符串和unicode字符串
- python 编码unicode 和 str
- python中编码问题——unicode, gbk, utf8
- 老中医---根治python编码问题(unicode,str等)
- Python菜鸟晋级03----repr() 与str() 函数的区别
- python中的unicode和str编码
- python编码(str和unicode)
- 了解python中bytes,str和unicode的区别
- python2 字符串unicode str编码解码问题
- [python] LDA处理文档主题分布及分词、词频、tfidf计算
- Luogu 3805(manacher)
- 机器人sci
- java学习之路
- MYSQL 中 LIMIT 用法
- python函数——编码问题——str与Unicode的区别
- 通过考试
- 最近公共祖先(LCA) RMQ解决
- POJ 2449 Remmarguts' Date(k短路)
- HTML浏览器的关闭或打开
- https://github.com/dangdangdotcom/dubbox
- -TEST 20 for NOIP 。。。(80-300)-----(( ! ))
- BeanUtils.populate的作用
- 初识Html标签