您的位置:首页 > 编程语言 > Python开发

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

2017-07-08 15:49 597 查看

*几个问题:

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.[b]ASCII码(->EASCII码)[/b]

2.(GB2312码)[b]GBK码(收录了少数民族文字) 是中国人自己创造的,解决了所有汉字的编码问题[/b]

3.[b]Unicode编码 它为世界上每一种语言的每一个字符定义了一个唯一的字符码(16进制数字表示两字节或者四字节编码)[/b]

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

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

三、Python中的编码问题

Python的默认编码是ASCII码



附:切换默认编码的方法



所以在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类型进行编码,

而假如指定了和原类型不同的编码就会出现乱码





四、检验编码的工具–chardet

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


———-欢迎大家批评指正以及留言提问———-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: