快速入手Python字符编码


Posted in Python onAugust 03, 2016

前言

对于很多接触Python的人而言,字符的处理和语言整体的温顺可靠相比显得格外桀骜不驯难以驾驭。

文章针对Python 2.7,主要因为3对的编码已经有了很大的改善并且实际原理一样,更改一下操作命令即可。

了解完本文,你可以轻松解决文字处理,特殊平台(Windows?)下的编码,爬虫编码等问题。

阅读建议

本文分为如下几个部分:

    1.原理

    2.具体操作

    3.建议的使用习惯

    4.疑难问题解答

如果想要了解我给出的使用习惯,可以直接跳到建议的使用习惯。

如果只想要解决相关问题可以直接跳到疑难问题解答。

希望本文能够帮到你。

原理

为了理解方便,这里不谈理论只做类比,具体想要进一步了解各种编码的理论的百度一下好了。

首先说一下我们为什么会碰到各式各样的编码问题:

    1.因为我们没有统一编码

    2.因为我们没有用对命令(传对数据)

再说一下编码是什么,Python的编码看似复杂,实际上可以看做只有两类编码:Unicode,二进制

     1.Unicode 相信都很熟悉:,就是\u0000这样的

     2.二进制编码也很简单,就是\x00\x00这样的,平常看到的utf-8,cp936都是二进制编码

     3.二进制编码是具象的10001100原样就可以存储,而Unicode是抽象的,不能这样存

#coding=utf8

# Unicode编码演示
print('Unicode:')
print(repr(u'Unicode编码'))`

# 二进制编码演示
print(u'二进制编码:')
print(repr('Unicode编码'))`

# 只是看个样子,代码不必去深究

再说怎么做,就是只有同种编码之间才可以操作

举个简单的类比

     就把一串数据比为烤鸭,我们作为人和鸭子不同种看待烤鸭的态度完全不一样。

     我们看到的是晚上的配菜,鸭子看到的是自己二舅。

     那么我在逛烤鸭店的时候用错编码就会报错。

     因为我在烤鸭店看到了满世界的二舅。

这里说的同种就是我们熟悉的各种编码方式:utf-8,unicode,ucs-bom

这也就是编码问题的核心,非常重要。

最后说一下Python的环境

    1.本身代码是用Ascii解码的,文件里有Ascii无法解码的内容的话要告知Python怎么解码

    2.内部大量命令都是默认接受Unicode

# 告知的命令就是下面这一行,删掉就会报错
#coding=utf8
print(u'测试编码')

具体操作

拿到各种编码的内容自然是不用说,那么如果我们想要自己构造怎么做呢,看下面:

#coding=utf8

# 字符串前面加u会默认构造出Unicode的字符串
unicodeString = u'Unicode字符串'

# 字符串前面什么都不加会构造出默认编码(首行限定了现在的utf8)的字符串
utf8String = 'Utf-8字符串'

# 当然,没有首行,默认的编码是Ascii

那么他们之间怎么转换呢,同样很简单:

# 接上一段程序

# Unicode转化为二进制编码中的一种:utf8
unicodeString.encode('utf8')

# 二进制编码根据自己的编码种类转化为Unicode
utf8String.decode('utf8')

# 如果二进制编码中混进了奇怪的东西可以根据需求用特殊的decode策略
print(repr('u8字\x00符串'.decode('utf8', 'replace')))

那么怎么样会出现问题呢:

# 接上一段程序

# 如果我们把他们转化成同样的编码方式就可以操作(例如相加)
print(repr(unicodeString + utf8String.decode('utf8')))
print(repr(unicodeString.encode('utf8') + utf8String))

# 但如果不转化,当然就会出现满世界的烤鸭二舅啦
unicodeString + utf8String

# 所以另一方面也发现,编码转换是需要我们告诉程序怎么做的
# 所有`decode`操作都会生成Unicode编码,这是为了方便我之前说的大量接受Unicode的内部命令

所以我们需要确定程序使用的编码,这是我们需要告诉程序的东西

    1.一方面在操作字符串的时候确定是同种编码

    2.另一方面在使用非自己写的命令时,一般使用Unicode,或者使用接收二进制编码的命令

#coding=utf8
# 这里拿写入文件举例

# 一般使用Unicode
with open('Unicode.txt', 'w') as f: f.write(u'Unicode测试')

# 或者使用接收二进制编码的命令
with open('Utf8.txt', 'wb') as f: f.write('Utf8测试')

# 你可以反过来做个测试,自然会报错
# 二进制的命令方便了在不知道怎么解码的情况下也能进行操作(写入文件)

我建议的使用习惯

相信到这里我已经把我对于编码的理解讲完了。

我们为什么会碰到各式各样的编码问题:

    1.因为我们没有统一编码

    2.因为我们没有用对命令(传对数据)

所以这里再重申一下八字真言:确定编码,同类交互

    1.碰到问题,问一下自己,我现在是哪种编码

    2.同一种编码才能交互,那我应该是哪种编码

这里给出我的使用习惯:

    1.确定一种内部编码

    2.内部编码的选择优先级如下:程序必须使用的编码、第三方包使用的编码、你喜欢的编码、Unicode

    3.在输出时再更改到特定的编码

记得在开始整个程序之前确定内部的编码,否则编码一团糟会产生很多不必要的bug。

不要迷信内部Unicode,例如Evernote开发就应该根据第三方包使用的Utf8确定内部编码。

疑难问题解答

编码识别

说了要确定编码,那么拿到一串二进制要怎么确定编码呢?

最简单的方法是chardet:(需要安装)

python -m pip install chardet

使用非常简单:

#coding=utf8

from chardet import detect
print(detect('这是一串utf8的测试字符'))

# 结果:`{'confidence': 0.99, 'encoding': 'utf-8'}`

另外例如抓取网站,那么头文件中很有可能有提示如何解码,记得不要忘记了。

编码转换

很可能因为字符串中参杂了奇怪的东西,导致即使编码种类正确,依旧无法解码。

我知道我之前讲过了,但可能有人直接跳疑难问题解答嘛。

这里可以使用decode的第二个参数:

#coding=utf8

# 字符串中混进了\x00
rubbishUtf8String = 'Utf-8字\x00符串'

print(repr(rubbishUtf8String.decode('utf8', 'replace')))

print(repr(rubbishUtf8String.decode('utf8', 'ignore')))

特殊平台下编码

很多人都说Windows是个坑,即使在Python 3下面也一样。

因为中文文件名出来都是乱码。

这里使用一个取巧的方法:平台编码再特殊,起码命令行读取和创建一个文件夹不会出乱码吧。

import sys, os

for folder in os.walk('.').next()[1]:
  print(folder.decode(sys.stdin.encoding))

同样的输入输出也可以这样做优化:

import sys

def sys_print(msg):
  print(msg.encode(sys.stdin.encoding))

def sys_input(msg):
  return raw_input(msg.encode(sys.stdin.encoding)).decode(sys.stdin.encoding)

文件写入

如果抓下来一个内容不知道怎么解码,但还是想要写入文件怎么办

写入文件的时候制定用二进制命令即可:

#coding=utf8
import urllib

with open('Utf8.txt', 'wb') as f: f.write('Utf8测试')

# 比如抓了个网页,不知道编码也可以写入文件进行一系列操作

content = urllib.urlopen('http://www.baidu.com').read()
with open('baidu.txt', 'wb') as f: f.write(content)

裸Unicode字符

Unicode存成六个Ascii字符怎么办?其实也可以decode

#coding=utf8
# 这是普通的Unicode
s = u'测'
for i in s: print(i)
print(repr(s))

# 这是裸Unicode,实际存成了六个Ascii
s = repr(s)[2:-1]
for i in s: print(i)
print(repr(s))

# 转化其实也很简单
s = s.decode('unicode-escape')
for i in s: print(i)
print(repr(s))

总结

以上就是详细介绍Python字符编码的全部内容,希望读完这篇文章能对大家能有帮助,有什么不足之处万望指正,希望大家多多支持三水点靠木。

Python 相关文章推荐
Saltstack快速入门简单汇总
Mar 01 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
Jun 21 Python
Python绘制频率分布直方图的示例
Jul 08 Python
查看端口并杀进程python脚本代码
Dec 17 Python
使用Python爬虫库requests发送表单数据和JSON数据
Jan 25 Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
Mar 06 Python
Jupyter Notebook输出矢量图实例
Apr 14 Python
Python实现Keras搭建神经网络训练分类模型教程
Jun 12 Python
Python调用系统命令os.system()和os.popen()的实现
Dec 31 Python
python中sqllite插入numpy数组到数据库的实现方法
Jun 21 Python
Python接口自动化之文件上传/下载接口详解
Apr 05 Python
Python采用Django制作简易的知乎日报API
Aug 03 #Python
利用Python实现图书超期提醒
Aug 02 #Python
Python正规则表达式学习指南
Aug 02 #Python
Python实现SMTP发送邮件详细教程
Mar 02 #Python
python logging 日志轮转文件不删除问题的解决方法
Aug 02 #Python
python中的字典使用分享
Jul 31 #Python
Python随机生成数据后插入到PostgreSQL
Jul 28 #Python
You might like
《猛禽小队》:DC宇宙的又一超级大烂片
2020/04/09 欧美动漫
php基础知识:控制结构
2006/12/13 PHP
具有时效性的php加密解密函数代码
2013/06/19 PHP
ThinkPHP无限级分类原理实现留言与回复功能实例
2014/10/31 PHP
PHP PDO fetch 模式各种参数的输出结果一览
2015/01/07 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
用PHP的反射实现委托模式的讲解
2019/03/22 PHP
JS关键字变色实现思路及代码
2013/02/21 Javascript
JQuery调webservice实现邮箱验证(检测是否可用)
2013/05/21 Javascript
jQuery添加/改变/移除CSS类及判断是否已经存在CSS
2014/08/20 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
2016/07/28 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
BootStrap中
2016/12/10 Javascript
详解Vue中过度动画效果应用
2017/05/25 Javascript
Jquery EasyUI $.Parser
2017/06/02 jQuery
JS实现的简单标签点击切换功能示例
2017/09/21 Javascript
十分钟带你快速了解React16新特性
2017/11/10 Javascript
vue项目常用组件和框架结构介绍
2017/12/24 Javascript
微信小程序之多文件下载的简单封装示例
2018/01/29 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
jquery轮播图插件使用方法详解
2020/07/31 jQuery
[01:03:51]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第三场
2018/04/09 DOTA
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
python中pip的安装与使用教程
2018/08/10 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
python3正则模块re的使用方法详解
2020/02/11 Python
Python在字符串中处理html和xml的方法
2020/07/31 Python
纯CSS3制作漂亮带动画效果的主机价格表
2015/04/25 HTML / CSS
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
2013/01/30 HTML / CSS
法国亚马逊官方网站:Amazon.fr
2020/12/19 全球购物
2015年教师节慰问信
2015/03/23 职场文书
2015年超市工作总结
2015/04/09 职场文书
2015年幼师工作总结
2015/04/28 职场文书
廉政党课工作报告案例
2019/06/21 职场文书