Python基础【day03】:字符转编码操作

一、概述

说到python的编码,一句话总结,说多了都是泪啊,这个在以后的python的开发中绝对是一件令人头疼的事情。所以有必要要讲讲清楚

二、编码介绍

1、须知:

  • 在python 2中默认编码是 ASCII,而在python 3中默认编码是 unicode
  • unicode 分为utf-32 (占4个字节),utf-16(占两个字节),utf-8(占1-4个字节),所以utf-16 是最常用的unicode版本,但是在文件里存的还是utf-8,因为utf8省空间
  • 在python 3,encode编码的同时会把stringl变成bytes类型,decode解码的同时会把bytes类型变成string类型
  • 在unicode编码中 1个中文字符=2个字节,1个英文字符 = 1个字节,切记:ASCII是不能存中文字符的
  • utf-8是可变长字符编码,它是unicode的优化,所有的英文字符依然按ASCII形式存储,所有的中文字符统一是3个字节
  • unicode包含了所有国家的字符编码,不同字符编码之间的转换都需要经过unicode的过程
  • python本身的默认编码是utf-8

2、py2中的编码和转码的过程,如图:

注:因为unicode是中间编码,任何字符编码之前的转换都必须解码成unicode,在编码成需要转的字符编码

3、py2字符编码的转换,代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#! /usr/bin/env python

# -*- coding:utf-8 -*-

# __auther__ == zhangqigao

= "其高最帅"

#utf-8解码成unicode编码

s_to_unicode = s.decode("utf-8")

print("--------s_to_unicode-----")

print(s_to_unicode)

#然后unicode再编码成gbk

s_to_gbk = s_to_unicode.encode("gbk")

print("-----s_to_gbk------")

print(s_to_gbk)

#gbk解码成unicode再编码成utf-8

gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")

print("------gbk_to_utf8-----")

print(gbk_to_utf8)

#输出

--------s_to_unicode-----

其高最帅

-----s_to_gbk------

??????

------gbk_to_utf8-----

其高最帅

注:以上这种情况适合字符是非unicode编码请款下,但是如果字符编码已经是Unicode的了咋办呢?广告回来,更加精彩。。。。。

4、字符编码已经是unicode情况下,代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#! /usr/bin/env python

# -*- coding:utf-8 -*-

# __auther__ == zhangqigao

#u代码字符编码是unicode

= u‘你好‘

#已经是unicode,所以这边直接是编码成gbk

s_to_gbk = s.encode("gbk")

print("----s_to_gbk----")

print(s_to_gbk)

#这边再解码成unicode然后再编码成utf-8

gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")

print("-----gbk_to_utf8---")

print(gbk_to_utf8)

#输出

----s_to_gbk----

???

-----gbk_to_utf8---

你好

注:在python2中,在文件的开头指定字符编码,是要告诉解释器我现在的字符编码使用的是utf-8,那我在打印的中文时候,那么在utf-8中包含中文字符,那么可以打印出来。那么如果你不制定字符编码,默认使用系统编码,如果你的系统编码是ASCII,那么就会报错,因为ASCII不能存中文字符。

5、py3的字符编码转换

在须知中已经说到python 3的编码,默认是unicode,所以字符编码之间的转换不需要decode过程,直接encode即可,代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#! /usr/bin/env python

# __auther__ == zhangqigao

#无需声明字符编码,当然你声明也不会报错

= ‘你好‘

# 字符串s已经是unicode编码,无需decode,直接encode

s_to_gbk = s.encode("gbk")

print("----s_to_gbk----")

print(s_to_gbk)

#这边还是一样,gbk需要先解码成unicode,再编码成utf-8

gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")

print("-----gbk_to_utf8---")

print(gbk_to_utf8)

#解码成unicode字符编码

utf8_decode = gbk_to_utf8.decode("utf-8")

print("-------utf8_decode----")

print(utf8_decode)

#输出

----s_to_gbk----

b‘\xc4\xe3\xba\xc3‘

-----gbk_to_utf8---

b‘\xe4\xbd\xa0\xe5\xa5\xbd‘

-------utf8_decode----

你好

注:在python 3,encode编码的同时会把stringl变成bytes类型,decode解码的同时会把bytes类型变成string类型,所以你就不难看出encode后的把它变成了一个bytes类型的数据。还有需要特别注意的是:不管是否在python 3的文件开头申明字符编码,只能表示,这个python文件是这个字符编码,文件中的字符串还是unicode,如下图:

总结:

  1. uniocode能识别所有字符编码的字符串
  2. 在python 2中,字符编码之间的转化需要通过unicode才能转换,所以打印时,可以是使用unicode,也可以使用对应的字符编码(文件开头指定编码),打印字符或者字符串,因为py2中没有对字符和字节做明显区分,所以才混导致这样的结果。
  3. 在python 3中,只有通过Unicode去识别字符的,如果转成编码成对应编码格式了,就直接变成对应编码的bytes类型的字节码,也就是二进制,需要识别,必须解码成Unicode才能识别
  4. py3中如果说在文件开头已经指定了文件编码,为啥文件中用到的还是uniocde呐?因为py3中的对应编码是二进制,是bytes类型,是不能识别的,能识别的只有Unicode。因为py3中对字符和字节做了明显的区分,所以出现3和4阐述的情况。
  5. 说到这里,如果还是不明白的话,我引用一下别人的文章,阐述一下,python 2和python 3对字符和字节的区分:猛击这里
时间: 2024-10-28 01:53:24

Python基础【day03】:字符转编码操作的相关文章

Python 之 字符转编码操作

字符转编码操作 # -*- coding:utf-8 -*- import sys print(sys.getdefaultencoding()) s = "你好" python2写法,将s转换成"gbk" s_to_gbk = s.decode("utf-8").encode("gbk") #1.在Python2下,所有字符编码为"ascii"#2.当文件头声明定义为:utf-8#3.将s转换gbk,首先

第五篇:python基础之字符编码

1. 计算机基础知识(三幅图) 2. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的,断电后数据丢失 因而需要保存到硬盘上,点击保存按钮,就从内存中把数据刷到了硬盘上. 在这一点上,我们编写一个py文件(没有执行),跟编写其他文件没有任何区别,都只是在编写一堆字符而已.  3. python解释器执行py文件的原理 ,例如python test.py 1.第一阶段,python解

Python基础day-5[字符编码,文件处理,函数]

字符编码: 为什么要有字符编码?字符编码是为了让计算机能识别我们人写的字符,因为计算机只认识高低电平,也就是二进制数"0","1". 字符编码其实就是在完成一件,字符====>数字的翻译过程. ASCII: 最早计算机是美国发明的,所以最早诞生的ASCII码也是基于英文考虑的.ASCII码:一个Bytes代表一个字符,1Bytes=bit.最早的ASCII只用到后七位. 127个数字,已经完全能代表键盘了,后来又把127号之后的空位来表示新的字母.符号,还加入

python基础之字符编码(一)

一.什么是字符编码 计算机要想工作必须通电,也就是说'电'驱使计算机干活,而'电'的特性,就是高低电压(高低压即二进制数1,低电压即二进制数0),也就是说计算机只认识数字 编程的目的是让计算机干活,而编程的结果说白了只是一堆字符,也就是说我们编程最终要实现的是:一堆字符驱动计算机干活 所以必须经过一个过程: 字符串--------(翻译过程)------->数字 这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之为字符编码 二.字符编码分类 计算机由美国人发明,最早的字符编码为AS

Python 基础之字符编码

字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节.比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295. 由于计算机是美国人发明的,因此,最早只有1

python基础3 字符编码

本节主要内容: 基本概念 ASCII及其扩展 中文字符编码 unicode 注释 参考网页 基本概念 计算机中储存的信息都是二进制的0/1串,当我们要在计算机中存储诸如英文.中文.标点符号等字符时,需要先把字符转化成二进制的0/1串之后再保存到计算机中:而当我们要读取保存在计算机中的信息时,需要通过一定的方法把里面的二进制0/1串转化成为原先的字符,然后再通过显示器等渠道进行显示. 这里涉及到字符编码的两个基本概念: 字符集(Character Set):指系统支持的所有字符的集合.字符包括涉及

python基础12 字符编码

主要内容 字符编码 字符编码 基本概念 字符(Character) 是各种文字和符号的总称. 字符集(Character set) 是一个系统支持的所有抽象字符的集合. 字符编码(Character encoding) 是把字符集中的字符,编码为特定的二进制数,以便在计算机中存储.每个字符集中的字符都对应一个唯一的二进制编码. 字符集和字符编码一般都是成对出现的,如ASCII.IOS-8859-1.GB2312.GBK,都是即表示了字符集又表示了对应的字符编码.Unicode比较特殊,有多种字符

Python基础-day03

写在前面 上课第三天,打卡:  不要让干净的灵魂染上尘埃,永远年轻.永远热泪盈眶 一.再谈编码 - 文件的概念 '文件' 是一个抽象的概念,是操作系统提供的外部存储设备的抽象,对应底层的硬盘:它是程序和数据的最终存放地点. 操作系统把硬盘存储的具体操作封装起来,提供一些简单易用的API,让用户不用去关心底层复杂的实现方法: 即:让用户的数据存放变得容易.方便和可靠. 另外,磁盘没有 '修改' 一说,全部都是覆盖: - Unicode 和 utf-8 > 备注:这段精辟的解释来自于 林海峰老师的博

python 基础 -02 运算符和编码

一 格式化输出  %s就是代表字符串占位符,除此之外,还有%d, 是数字占位符, 如果把上面的age后面的换成%d,就代表你必须只能输入数字, 这时对应的数据必须是int类型. 否则程序会报错 使用时,需要进行类型转换. int(str) # 字符串转换成int str(int) # int转换成字符串 现在又来了新问题 . 如果想输出: 我叫xxx, 今年xx岁了,我们已经学习了2%的python基础了 在字符串中如果使用%s这样的占位符. 那么所有的%都将变成占位符. 我们的2%也变成占位符