前言

对于很多接触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字符编码在哪里_快速入手Python字符编码相关推荐

  1. python web自动化元素定位_快速掌握Python Selenium Web自动化:三)在Selenium中定位查找网页元素的诸类方法...

    使用Selenium进行自动化操作,首先要做的就是通过webdriver的get()方法打开一个URL链接. 在打开链接,完成页面加载之后,就可以通过Selenium提供的接口,在页面上进行各种操作了 ...

  2. python赋予x新值_快速为 Python 字典设置新的值

    dict = {'evaporation': {'释义': '蒸发', '词性': 'n'}, 'carpenter': {'释义': '木匠', '词性': 'n'}} 常规做法通常是这样,即先验证 ...

  3. python异步回调实现原理_快速理解Python异步编程的基本原理

    第一个例子 假设你需要用电饭煲煮饭,用洗衣机洗衣服,给朋友打电话让他过来吃饭.其中,电饭煲需要30分钟才能把饭煮好,洗衣机需要40分钟才能把衣服洗好,朋友需要50分钟才能到你家.那么,是不是你需要在这 ...

  4. python operator 多属性排序_快速入门Python必备的基础知识

    本文内容目录: 变量 注释 数据类型 条件判断 循环 函数 模块 数据结构 1.变量 在代码里,我们用变量来存放数据,利用"="为变量赋值. 变量的命名技巧:前半部分能代表数据的意 ...

  5. python都有什么包_常用的Python包有哪些,如何快速掌握Python编程

    Python入门简单.功能强大,是很多想要入行IT开发行业人士的主要选择.Python包可以帮助Web开发人员快速和容易地创建应用程序和功能,因此很多企业在招聘时都会考察求职者对于Python包的掌握 ...

  6. python中gbk字符原因报错_深入理解Python中的字符和编码,结合,了解,与

    一.前言 在学习python初期,常常会对运行文件出现的各种"codec"报错摸不着头脑有没有? 对各种编码方式的区别和适用的情况混淆有没有? 对python2,python3 编 ...

  7. python思维导图完整版下载高清_快速学习 Python 的全套 14 张思维导图(附高清版下载)...

    来源:机器学习算法与自然语言处理 本文主要涵盖了 Python 编程的核心知识(暂不包括标准库及第三方库).按顺序依次展示了以下内容的一系列思维导图:基础知识,数据类型(数字,字符串,列表,元组,字典 ...

  8. python tab和空格混用_我的 Python 编码规范

    python 文件的组成 为了便于描述,先上一个 demo #!/usr/bin/env python# -*- coding: utf-8 -*-"""通常这里是关于本 ...

  9. python程序员专用壁纸_神级python程序员分享的让小白30分钟快速上手的一张神图,赶快收藏!...

    原标题:神级python程序员分享的让小白30分钟快速上手的一张神图,赶快收藏! 现在很多人学编程都把Python作为入门语言,其实这是个很不错的选择,那么你知道新手如何学Python吗?小编给大家分 ...

最新文章

  1. Microbiome:宏基因组分箱流程MetaWRAP简介
  2. php文件的标准格式化,PHP获取文件大小并格式化的几种方法
  3. 移动硬盘提示此卷不包含可识别的文件系统数据如何恢复
  4. 打印出所有的 info.plist 中的 keys、values
  5. Redux入门之实现一个迷你版的Redux
  6. balanced binary search tree
  7. 真正优秀的程序员有哪些与众不同之处?
  8. eclipse报jvm terminated.exitcode=2错误的解决方法
  9. c/c++ 编译器内存对齐问题
  10. webservice使用EF生成的model序列化问题
  11. MegCup 2017 极客挑战赛 初赛试题
  12. ubuntu 16.04 LTS 开发环境的安装及常用软件
  13. 【字符串算法1】 再谈字符串Hash(优雅的暴力)
  14. PPP协议基础与工作流程
  15. jsp文件放在WebRoot下还是WebInfo下
  16. 外贸询盘通开篇我的十年SEO探索路
  17. 数仓4.0之即席查询
  18. 如何用随机森林算法,在深海养肥一群鱼
  19. python计算乘积_python中矩阵运算(乘法和数量积)
  20. 基于asp.net网上选课系统设计

热门文章

  1. numpy矩阵运算和常用函数
  2. python中运行错误: 'utf-8' codec can't decode byte 0xc8'
  3. UIAutomation识别UI元素
  4. ThinkPHP 数据库操作之数据表模型和基础模型 ( Model )
  5. php计算属性集的闭包,关于swift:计算属性与带闭包的属性集之间的区别
  6. 如何从Spring官网中下载完整的jar包(包含5.2.9版本最新版详解,当然所有版本均可下载)
  7. MongoDB学习笔记一ID自增长
  8. PHP源码分析-数组
  9. Linux之cut:简化版的awk
  10. Git的配置SSHKey