在字符编码问题上,python2 和python3 还是有点不同的.今日写篇博客,彻底理清这个问题..

字符编码问题的由来:

  这要从计算发展历史来看待这个问题了,一开始,歪果仁使用ASCII码,8位(仅仅使用了7位,126个字符),一个字节,就把自己语言中所有基本字符都囊括在内,并没有考虑到别的国家字符太多,一个ASCII不够用的情况...

随着计算机的在全世界的普及,原本的ASCII不能适应,于是在ASCII基础上,诞生了unicode编码(万国码),占用2个字节.所有的字符都包含了,编码不同造成的乱码问题就解决了.

  但是,全部使用了unicode编码,又带来一个问题,就是浪费...

  本着不浪费的原则,又诞生出可变长编码utf8,UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。

  UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

  

  如上图,在python2中,如果需要把utf8 转换成gbk,需要通过unicode中转.其中encode编码,decode解码..

  utf8 --> unicode -->gbk

或者gbk --> unicode -->utf8

python2代码演示:

 s="字符编码问题"  ##utf8编码格式
s_to_unicode = s.decode("utf-8")
print(s_to_unicode) ##字符编码问题(unicode)
print(s) ##字符编码问题(utf8)
print(type(s_to_unicode),type(s),s_to_unicode,s) ##输出一个,(<type 'unicode'>, <type 'str'>),(u'\u5b57\u7b26\u7f16\u7801\u95ee\u9898', '\xe5\xad\x97\xe7\xac\xa6\xe7\xbc\x96\xe7\xa0\x81\xe9\x97\xae\xe9\xa2\x98') unicode_to_gbk = s_to_unicode.encode("gbk")
print(unicode_to_gbk) ##�ַ���������

python2 编码转换

python3 帮我们做了个优化,编码转换不需要在经过unicode了,utf8直接转成gbk,或者gbk直接转成utf8

utf8 --> gbk

gbk -->utf8

python 3代码演示:

 s="字符编码问题python 3"  ##utf8编码格式
s_to_gbk = s.encode("gbk")
print(s_to_gbk) ## b'\xd7\xd6\xb7\xfb\xb1\xe0\xc2\xeb\xce\xca\xcc\xe2python 3' s_to_gbk = s.encode("utf8") ##b'\xe5\xad\x97\xe7\xac\xa6\xe7\xbc\x96\xe7\xa0\x81\xe9\x97\xae\xe9\xa2\x98python 3'
print(s_to_gbk)

python3 编码转换

python3中默认使用的编码utf8,utf8中,每个汉字占用3个字节,gbk中,每个汉字占用2个字节从上面代码结果显示,可以很直观的得出..

python2中,循环读出字节,而python3中循环读出字符.

代码演示:  ps:文件的编码格式和字符串的编码格式以及终端的编码格式一致才能正常的输出想要的字符串。这里单独print(i),会不正常显示..

 name="字符"
for i in name:
# print(i)
print(type(i),i)
# print(i)
#结果:
(<type 'str'>, '\xe5')
(<type 'str'>, '\xad')
(<type 'str'>, '\x97')
(<type 'str'>, '\xe7')
(<type 'str'>, '\xac')
(<type 'str'>, '\xa6')

python2

代码演示:

 s="字符编码问题python 3"  ##utf8编码格式
for i in s:
print(i)
#结果:






p
y
t
h
o
n 3

python3

python3 比pythn2 更加友好,更加高级..所以下面还是用python3吧.

Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分特别清晰。你不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)。

字符串可以编码成字节包,而字节包可以解码成字符串。

演示代码:

 res1 = '€20'.encode('utf-8')
res2 = b'\xe2\x82\xac20'.decode('utf-8')
print(res1,res2)
结果:
b'\xe2\x82\xac20' €20

演示代码

先介绍2个函数: bytes() 和str()

bytes():

作用:将字符转成字节,

     def __init__(self, value=b'', encoding=None, errors='strict'): # known special case of bytes.__init__
"""
bytes(iterable_of_ints) -> bytes
bytes(string, encoding[, errors]) -> bytes
bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer
bytes(int) -> bytes object of size given by the parameter initialized with null bytes
bytes() -> empty bytes object Construct an immutable array of bytes from:
- an iterable yielding integers in range(256)
- a text string encoded using the specified encoding
- any object implementing the buffer API.
- an integer
# (copied from class doc)
"""
pass

bytes()

str():

    def __init__(self, value='', encoding=None, errors='strict'): # known special case of str.__init__
"""
str(object='') -> str
str(bytes_or_buffer[, encoding[, errors]]) -> str Create a new string object from the given object. If encoding or
errors is specified, then the object must expose a data buffer
that will be decoded using the given encoding and error handler.
Otherwise, returns the result of object.__str__() (if defined)
or repr(object).
encoding defaults to sys.getdefaultencoding().
errors defaults to 'strict'.
# (copied from class doc)
"""
pass

str()

一个简单的题目:将你的名字,转成2进制显示出来(python 3)

 name = "张三"
for i in name:
i_bytes = bytes(i,encoding='utf8')
for i in i_bytes:
print(bin(i))
结果:
0b11100101
0b10111100
0b10100000
0b11100100
0b10111000
0b10001001

题目代码

python 2和3 字符编码的更多相关文章

  1. python之旅:字符编码

    一 了解字符编码的知识储备 一 计算机基础知识 知识储备:cpu.内存.硬盘 二 文本编辑器存取文件的原理(nodepad++,pycharm,word) #1.打开编辑器就打开了启动了一个进程,是在 ...

  2. python基础——6(字符编码,文件操作)

    今日内容: 1.字符编码: 人识别的语言与机器识别的语言转化的媒介 *****     2.字符与字节: 字符占多少字节,字符串转化 ***     3.文件操作: 操作硬盘中的一块区域:读写操作  ...

  3. python文件操作:字符编码与文件处理

    一.字符编码 二.文件处理 一.字符编码 储备知识点: 1. 计算机系统分为三层: 应用程序 操作系统 计算机硬件 2. 运行python程序的三个步骤 1. 先启动python解释器 2. 再将py ...

  4. python标准库之字符编码详解

    codesc官方地址:https://docs.python.org/2/library/codecs.html 相关帮助:http://www.cnblogs.com/huxi/archive/20 ...

  5. 小白的Python之路 day1 字符编码

    字符编码 python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill) ASCII(American Standard Code for Information Interc ...

  6. Python 入门基础6 --字符编码、文件操作1

    今日内容: 1.字符编码 2.字符与字节 3.文件操作 一.字符编码 了解: cpu:将数据渲染给用户 内存:临时存放数据,断电消失 硬盘:永久存放数据,断电后不消失 1.1 什么是编码? 人类能够识 ...

  7. python文件操作与字符编码

    知识内容: 1.文件对象与文件处理流程 2.基本操作 3.上下文管理 4.文件的修改与文件内光标的移动 5.字符编码 一.文件对象与文件处理流程 1.文件对象 (1)文件分类 按文件中数据的组织形式可 ...

  8. Python 3 文件和字符编码

     一.文件: 打开文件的模式有: r,只读模式(默认). w,只写模式. 不可读,不存在则创建:存在则删除内容 a,追加模式. 可读,不存在则创建:存在则只追加内容 "+"表示可以 ...

  9. python开发基础之字符编码、文件处理和函数基础

    字符编码 为什么要有字符编码? 字符编码是为了让计算机能识别我们人写的字符,因为计算机只认识高低电平,也就是二进制数"0","1". 一个文件用什么编码方式存储 ...

  10. 【python】-- 字符串、字符编码与转码

    字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可:访问子字符串,可以使用方括号来截取字符串: var1 ...

随机推荐

  1. P2294 [HNOI2005]狡猾的商人(差分约束)

    P2294 [HNOI2005]狡猾的商人 对于每个$(x,y,w)$,连边$(x-1,y,w),(y,x-1,-w)$,表示前$y$个月的收益比前$x-1$个月的收益大$w$ 这样题目就转化为询问图 ...

  2. Vue下简单分页及搜索功能

    最近利用Vue和element ui仿写了个小页面,记一哈分页和搜索功能的简单实现. 首页   emmmm..... 搜索框输入..... 搜索完成 数据是直接写在这里面的: cardPhoto:[ ...

  3. VB中IIF函数

    IIf 函数语法:IIf(表达式, 真值部分, 假值部分)根据表达式的值,表达式为真时,返回真值部分,表达式为假时,返回假部分.如:iif(a>0, "对","错& ...

  4. C++ STL(标准模板库)

    一.STL简介 STL(Standard Template Library,标准模板库)是惠普实验室开发的,在被引入C++之前该技术就已经存在了很长的一段时间. STL的代码从广义上讲分为三类:alg ...

  5. 【学习】020 Redis

    Java缓存机制 Java中要用到缓存的地方很多,首当其冲的就是持久层缓存,针对持久层谈一下:  要实现java缓存有很多种方式,最简单的无非就是static HashMap,这个显然是基于内存缓存, ...

  6. 通过jenkins给gitlab某代码路径打tag的方式

    1.构建后设置里的git publisher插件 https://blog.csdn.net/workdsz/article/details/77931812 2.通过gitlab api接口来 ht ...

  7. git如何将本地文件关联到远程服务器

    很多时候,当我们关联git服务器的时候,本地都有可能会有一些开发的东西需要同步上去.那怎么样设置同步呢!跟我来做,简易配置: git本地关联远程项目:      第一步:选择目录           ...

  8. 安装win10笔记

    1.使用pe安装的时候,要利用winNTSetup安装 2. 3.引导和安装驱动器都选择c盘 4.版本选择教育版,专业版photoshop 不好使.

  9. bzoj5099 [POI2018]Pionek 双指针

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5099 题解 这道题做法似乎挺单一的. (一开始想了个假做法 向量和的长度等于所有向量在其方向上 ...

  10. sqlserver数据库脱机和分离的区别

    脱机和分离的区别: 分离和脱机都可以使数据库不能再被使用,但是分离后需要附加才能使用,而脱机后只需联机就可以用了. 附加数据库报错: 无法打开物理文件 XXX.mdf".操作系统错误 5:& ...