在字符编码问题上,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. JS调用PageMethods

    http://www.cnblogs.com/Ren_Lei/archive/2010/07/14/1777413.html JS调用PageMethods 操作步骤: 1.新建一个WebApplic ...

  2. 设计模式开闭原则--java

    静态工厂模式 + 反射控制入参范围 public interface IPrinter { void print(); } public class CanonPrinter implements I ...

  3. Site error: the ionCube PHP Loader needs to be installed.解决办法

    问题描述: 有些模块的作者为了保护代码而采用ionCube加密的代码,所以这里必须给服务器装上这个php的扩展,就好像以前的zend一样 解决办法: http://bbs.52jscn.com/thr ...

  4. 如何学习ios(摘自知乎https://www.zhihu.com/question/20016551)

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Wang Hailong链接:https://www.zhihu.com/question/20016551/answer/1 ...

  5. 测试员小白必经之路----常见的Dos命令

    Dos是什么? 是一个命令行执行的操作系统 进入终端: win + r 运行输入: cmd 当前计算机的本地时间:Time 退出当前正在执行的命令: ctrl +c 设置在多少时间后自动关机: Shu ...

  6. Linux日常之以当前时间命名文件

    要求:将当前硬件信息的内容统一以一个文件的形式写入目录date中,且该文件是以“cpu_当前时间.txt”方式命名:    实现该要求主要理解三方面: (1) 显示当前硬件信息的命令:lscpu (2 ...

  7. 原始http下载图片生成文件

    package com.example.demo.util; import java.io.*;import java.net.URL;import java.net.URLConnection;im ...

  8. Django【第19篇】:Django之extra

    extra过滤 extra extra(select=None, where=None, params=None, tables=None, order_by=None, select_params= ...

  9. java初学第一天

    public class HellowWorld{ public static void main(String[] args){ System.out.println("jiuxu&quo ...

  10. linux运维、架构之路-linux目录结构

    1.linux重要目录 重要目录 说明 /etc 存放系统配置文件.服务启动命令的目录 /root 超级管理员的家目录 /sbin和usr/sbin 超级用户命令的目录 /boot 系统引导程序所在的 ...