字符串编码在python里是经常会遇到的问题,特别是写文件或是网络传输调用某些函数的时候.

现在来看看python中的unicode编码和utf-8编码

字符串编码的历史

  1. 计算机只能处理数字,文本转换为数字才能处理. 计算机中8个bit作为一个字节,所以一个字节能表示最大的数字为255

  2. 计算机是美国人发明的,一个字节就可以表示所有的英文字符了,所以ACSII(一个字节)编码就成为美国人的标准编码

  3. 但是中文里远远不止255个汉字,这时用ASCII来处理中文是明显不够用的,所以我国制定了GB2312编码,用两个字节表示一个汉字.

GB2312还把ASCII包含进去.同理,别的国家为了解决自己国家的编码问题也都发展了一套字节的编码,这样标准就越来越多.

如果一篇文章出现多种语言混合显示就一定会出现乱码.

  1. 这里unicode出现了,unicode把所有的语言统一到一套编码里.

  2. 看一下ASCII编码和unicode编码:

    字母A用ASCII编码十进制是65,二进制是0100 00001

    汉字"中"已经超出了ASCII编码的范围,用unicode编码是20013,二进制是0100 1110 0010 1101

    A用unicode编码只需要前面补0,二进制是00000000 0100 0001

  3. 乱码问题解决了,但是如果一段内容全是英文,unicode编码比ASCII需要多一倍的存储空间,浪费很多硬盘容量.同时传输时也需要多浪费很多带宽.

  4. "utf-8"会把英文变成一个字节,汉字3个字节.特别生僻的变成4到6个字节.如果传输的英文,就把英文轮换成unicode编码格式.

python保存文件和读取文件时编码的关系

保存文件时,把unicode编码转换成utf-8编码格式
读取文件时,把utf-8编码转换成unicode编码格式

分别在windows系统和linux系统中测试python2和python3的编码区别

windows系统的python2版本

    Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)] on win32
>>> str1="hello" # 因为str1和str2都是英文,所以atr1和str2不管是unicode编码还是ASCII格式
>>> str2=u"hello" # encode成utf-8编码时都不会出现错误
>>> str1.encode("utf-8")
'hello'
>>> str2.encode("utf-8")
'hello' >>> type(str1)
<type 'str'>
>>> type(str2)
<type 'unicode'> >>> str3="我用python" # python中的字符串在内存中是用unicode来编码的
>>> str4=u"我用python" # str3在windows系统中保存成GBK编码
>>> str3.encode("utf-8") # str3在调用encode方法之前必须转换为unicode编码
Traceback (most recent call last): # 此时str3应该先decode成为unicode编码,然后再encode成utf-8编码
File "<input>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128) >>> str3.decode("utf-8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "D:\Python27\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xce in position 0: invalid c
ontinuation byte >>> str3.decode('gbk')
u'\u6211\u7528python' >>> str3.decode("utf-8").encode("utf-8")
'\xe6\x88\x91\xe7\x94\xa8python' >>> str4.encode("utf-8")
'\xe6\x88\x91\xe7\x94\xa8python' >>> type(str3)
<type 'str'>
>>> type(str4)
<type 'unicode'> >>> import sys
>>> sys.getdefaultencoding()
'ascii'

windows系统的python3版本

    Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> str1="hello" # python3中所有的字符串都是unicode编码
>>> str2=u"hello"
>>> str1.encode("utf-8")
b'hello'
>>> str2.encode("utf-8")
b'hello'
>>> str3="我用python"
>>> str3.encode("utf-8")
b'\xe6\x88\x91\xe7\x94\xa8python'
>>> str4=u"我用python"
>>> str4.encode("utf-8")
b'\xe6\x88\x91\xe7\x94\xa8python' >>> import sys
>>> sys.getdefaultencoding()
'utf-8'

linux系统的python2版本

    Python 2.7.5 (default, Nov  6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> str1="我用python"
>>> str1.encode("utf-8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128) >>> str1.decode("gbk")
u'\u93b4\u6220\u6564python'
>>> str1.decode('utf-8') # linux系统中python2会把字符串保存成utf-8编码,那为什么不能直接encode呢?
u'\u6211\u7528python' # 字符串在encode之前应该保证是一个unicode编码格式,字符串在encode之前
# 会调用decode方法把字符串转换成unicode编码,然后才能encode
>>> str1.decode("utf-8").encode("utf-8") # str1字符串中含有中文,直接encode成utf-8编码会出现错误
'\xe6\x88\x91\xe7\x94\xa8python' >>> str1.decode("gbk").encode("utf-8")
'\xe9\x8e\xb4\xe6\x88\xa0\xe6\x95\xa4python' >>> str2=u"我用python"
>>> str2.encode("utf-8")
'\xe6\x88\x91\xe7\x94\xa8python' >>> type(str1)
<type 'str'>
>>> type(str2)
<type 'unicode'> >>> import sys
>>> sys.getdefaultencoding()
'ascii'

linux系统的python3版本

    Python 3.6.3 (default, Nov  7 2017, 20:33:25)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> str1="我用python" # python3中所有的字符串都是unicode编码
>>> str2=u"我用python"
>>> str1.encode("utf-8")
b'\xe6\x88\x91\xe7\x94\xa8python'
>>> str2.encode("utf-8")
b'\xe6\x88\x91\xe7\x94\xa8python' >>> import sys
>>> sys.getdefaultencoding()
'utf-8'

不管是windows系统还是linux系统,python2版本中默认使用ASCII编码,python3版本默认使用utf-8编码

python编码的那些事的更多相关文章

  1. (转载) 浅谈python编码处理

    最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...

  2. 【转】python编码规范

    http://blog.csdn.net/willhuo/article/details/49300441 决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是 ...

  3. python 编码规范整理

    PEP8 Python 编码规范 一 代码编排1 缩进.4个空格的缩进(编辑器都可以完成此功能),不要使用Tap,更不能混合使用Tap和空格.2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号. ...

  4. PEP8 - Python编码规范

    PEP8 - Python编码规范 PEP8 规范 官方文档:https://www.python.org/dev/peps/pep-0008/ PEP8 规范 中文翻译:http://www.cnb ...

  5. 转--python 编码规范

    编程规范 1.1. 命名规范 1.1.1. [强制] 命名不能以下划线或美元符号开始和结尾 反例: name / __name / $Object / name / name$ / Object$ 1 ...

  6. PEP8 Python 编码规范整理(转)

    决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的.所以今天下午我根据PEP 8整理了一份,以后都照此 ...

  7. python——PEP8 Python 编码规范整理

    决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的.所以今天下午我根据PEP 8整理了一份,以后都照此 ...

  8. PEP8 Python 编码规范整理(Python)

    add by zhj: 这个是豆瓣网友整理的PEP8,算是PEP8的一个简易版本,因为原PEP8内容太多,所以建议先看这篇文章,然后再看PEP8中文翻译 原文:http://www.douban.co ...

  9. Python 编码简单说

    先说说什么是编码. 编码(encoding)就是把一个字符映射到计算机底层使用的二进制码.编码方案(encoding scheme)规定了字符串是如何编码的. python编码,其实就是对python ...

随机推荐

  1. Jfinal启动源码解读

    本文对Jfinal的启动源码做解释说明. PS:Jfinal启动容器可基于Tomcat/Jetty等web容器启动,本文基于Jetty的启动方式做启动源码的解读和分析,tomcat类似. 入口  JF ...

  2. deeplearning.ai 改善深层神经网络 week3 超参数调试、Batch正则化和程序框架 听课笔记

    这一周的主体是调参. 1. 超参数:No. 1最重要,No. 2其次,No. 3其次次. No. 1学习率α:最重要的参数.在log取值空间随机采样.例如取值范围是[0.001, 1],r = -4* ...

  3. happymall 第十一章订单表 数据表设计

    为订单号生成唯一索引,用用户id和订单号生成组合索引提高查询效率.

  4. HDU 1242 Rescue(优先队列)

    题目来源: http://acm.hdu.edu.cn/showproblem.php?pid=1242 题目描述: Problem Description   Angel was caught by ...

  5. UE4 custom depth 自定义深度

    用途1: 半透明材质中实现遮挡Mesh自己其他部分的效果. 不遮挡效果如下: 遮挡后效果如下: 实现方法: 深度信息是越远值越大,使用两个Mesh,一个正常渲染,另一个渲染到custom depth ...

  6. dede织梦怎么修改description的字数

    织梦在调用描述的时候都会使用description来调用描述,想要更改字数也可以控制调用的字数,但是就算是这样更改也是有字数限制的,描述的字数是不能没有限制. 在模板中调用描述的标签一般有四种: 1: ...

  7. php的底层原理

    PHP说简单,但是要精通也不是一件简单的事.我们除了会使用之外,还得知道它底层的工作原理. PHP是一种适用于web开发的动态语言.具体点说,就是一个用C语言实现包含大量组件的软件框架.更狭义点看,可 ...

  8. Codeforces 448 D. Multiplication Table 二分

    题目链接:D. Multiplication Table 题意: 给出N×M的乘法矩阵要你求在这个惩罚矩阵中第k个小的元素(1 ≤ n, m ≤ 5·10^5; 1 ≤ k ≤ n·m). 题解: n ...

  9. java实现定时任务

    Java中实现定时任务执行某一业务.具体操作如下: 1.定义初始化任务 2.任务业务操作 3.定义初始化方法 4.在web.xml中注册启动 5.定义具体执行时间

  10. 详解python中的__init__与__new__方法

    一.__init__和__new__方法执行的顺序? 在面向对象中介绍了关于对象创建的过程,我们知道__new__方法先于__init__方法执行. 二.__new__方法是什么? 首先,我们先来看下 ...