Python 编码解码的问题(学习笔记+总结思考)

来源:互联网 发布:四川广电网络广元 编辑:程序博客网 时间:2024/05/21 17:59

*几个问题:

1.# coding: utf-8与sys.setdefaultencoding(‘utf-8’)的区别?
2.假如文件头 没有#coding: utf-8那么文件当前的编码是什么?
3.print是相当于读入么?print出来的结果的编码跟什么有关?

这几个问题会在看完以下知识后进行解答

一、基本概念:

1.字节:

字节是计算机中数据存储的基本单位,一字节等于一个8位的比特,计算机中的所有数据,不论是保存在磁盘文件上的还是网络上的传输数据(文字、图片、视频、音频文件)都是由字节组成的.

2.字符:

一个字符就是一个信息单位,是各种符号和文字的统称(例如’A’和”汉字”)

3.字符集:

某范围内字符的集合,不同的字符集规定了字符的个数,比如ASCII字符集总共有128个字符
而GB2312字符集定义了7445个字符,包含了绝大部分的汉字字符

4.字符码:

字符集中每个字符的数字编号,例如ASCII字符集用0-127连续的128个数字分别表示128个字符,例如”A”的字符码编号是65.(字符码形如01000001)

5.字符编码(此处编码为名词概念):

将字符集中的字符码映射为字节流的一种具体实现方案(比如把0100000101000010划分为01000001.01000010的方案)
字符集与字符编码有种对应关系,例如ASCII字符集对应ASCII编码

6.编码encode、解码decode(此处编码为动词概念):

通常来说:读入文件需要decode一下,写入文件需要encode一下
编码的过程:字符->字节流(计算机处理的是字节流不是字符,故而编码,是以特定的方式把字符变成字节流)
解码的过程:字节流->字符()

二、字符编码:(按演进顺序)

1.ASCII码(->EASCII码)
2.(GB2312码)GBK码(收录了少数民族文字) 是中国人自己创造的,解决了所有汉字的编码问题
3.Unicode编码 它为世界上每一种语言的每一个字符定义了一个唯一的字符码(16进制数字表示两字节或者四字节编码)

Unicode的局限:有时候会浪费空间; 在各个编码规则面前作用像英语

4.UTF-8 它是Unicode的一种实现方式,它是一种变长的字符编码

三、Python中的编码问题

Python的默认编码是ASCII码
查看python默认编码的方法
附:切换默认编码的方法
这里写图片描述
所以在Python2中,源代码的文件必须显示指定编码类型,代码中出现中文就会报错
#coding=utf-8
或者是
# -*- coding:utf-8

python2中字符串相关的类型有str和unicode两种类型
str类型的字符串的编码格式可以是ASCII、utf-8、gbk等任何一种
str(采用某种编码的字符串)–decode—>unicode串
unicode串–encode—>str(采用某种编码的字符串)

在python2中默认是用ascii码进行encode,decode操作
假如
s=’你好’
s.decode()
默认为ascii编码进行解码,但是ascii字符集中没有中文符
所以应该s.decode(‘utf-8’)

*回答几个问题:

1.# coding: utf-8与sys.setdefaultencoding(‘utf-8’)的区别?
# coding: utf-8是设置文件的字符的编码为’utf-8’,假如不这么设置那py文件中出现中文ide将无法识别其为什么字符更加无法对其操作;而sys.setdefaultencoding(‘utf-8’)是设置系统的默认编码方案,即默认以’utf-8’的编码方案读入和写出文件

2.假如文件头 没有#coding: utf-8那么文件当前的编码是什么?
ascii编码方案 因为这是python解释器默认的;
python内部使用的字符串的类型为unicode类型

3.print是相当于读入么?print出来的结果的编码跟什么有关?
print 也是要将unicode串 encode 成有特定编码的字节流,所以与写入操作的规则类似
假如print的对象是unicode类型即使是中文也不会出现乱码,因为编译器会自动对unicode类型进行编码,
而假如指定了和原类型不同的编码就会出现乱码

默认#encoding: utf-8
这里写图片描述

四、检验编码的工具–chardet

import chardetchardet.detect(串)通常只有只有str串可检测到编码方案

———-欢迎大家批评指正以及留言提问———-

原创粉丝点击