在字符编码问题上,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. Android remote gdb

    On Android phone adb push ~/utils/android-ndk-r12b/prebuilt/android-arm64/gdbserver/gdbserver /data/ ...

  2. 洛谷 - P1522 - 牛的旅行 - Cow Tours - Floyd

    https://www.luogu.org/problem/P1522 好坑啊,居然还有直径不通过新边的数据,还好不是很多. 注意一定要等Floyd跑完之后再去找连通块的直径,不然一定是INF. #i ...

  3. js倒计时跳转jquery插件版

    <script type="text/javascript" src="js/jquery1.91.min.js"></script> ...

  4. 【已解决】Error running 'xxx项目' Command line is too long(idea版)

    [错误] Error running 'xxx项目': Command line is too long. Shorten command line for xxx or also for Sprin ...

  5. react搭建

    https://juejin.im/post/5b4de4496fb9a04fc226a7af

  6. UITextView学习笔记

    =================================== UITextView =================================== 1.UITextView常用属性 ...

  7. WPS专业版及序列号

    目录 1. 软件下载 2. 序列号(永久) 1. 软件下载 城通网盘:https://sn9.us/dir/13403389-35833830-3fc98f (仅Android版) 官网: https ...

  8. 关于tomcat NoClassDefDoundErr异常的记录

    在做DRP项目的时候,copy了drp1.3,粘贴重命名成drp1.4,把drp1.4加入到tomcat中,发现drp1.4中新加的jsp可以正常运行,而从1.3那copy来的不能运行,抛出NoCla ...

  9. linux中未实现的系统调用

    afs_syscall, break, fattach, fdetach, ftime, getmsg, getpmsg, gtty, isastream, lock, madvise1, mpx, ...

  10. TCP/IP基础总结性学习(5)

    与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率. 一. 用单台虚拟主机实现多个域名 HTTP/1.1 规范允许 ...