字符编码
字符编码一直是个很基础,但又很容易让人模棱两可的问题,不弄清楚的话,随时会给你刷一波存在感,让你很头痛。
下面就简洁的说下编码的各个概念:
编码介绍
ASCII码:用一个字节中的存储的数字代表每个字符的编码
显然要表示除英文外诸如汉族日文等字符很无力,因此最简单粗暴的增加字节数,就有了Unicode编码
Unicode码:用四个字节中存储的数字代表每个字符的编码,主要编程语言都默认使用Unicode码:
但是人们觉得以前用ASCII码表示的字符,再用Unicode码表示太浪费空间,就出现了各种Unicode码的变种,它们一个重要特点就是同一个字符的编码是和Unicode编码相同,只是存储的形式不同。
UTF-8:Unicode最通用的一种变种,用一到四个字节中存储的数字代表每个字符的编码
UTF-8是个很好的东西,它兼顾了Unicode和ASCII的优点,在能对所有字符进行编码的基础上尽可能的节省了空间。
GB2312/GBK: 中文的特殊编码,兼容ASCII码
乱码正是由于各个文字自己独特的编码导致的,比如上面的GBK等等。
Python字符串
Python2中的字符串:
1. str:其实更形象的应该称为——字节串
2. unicode:以unicode编码的真正的字符串,以字母’u’打头
Python3中的字符串:
1. str:unicode编码的字符串
2. bytes:对应python2中的str——字节串,以字母’b’打头
两种字符串的转换关系:
字节串(解码) —> 字符串 bytes.decode(‘utf-8’)
字符串(编码) —> 字节串 str.encode(‘utf-8’)
代码文件的编码
# -*- coding: utf-8 -*-
此声明指示代码文件的编码
如果没有此文件编码类型的声明,则默认以ASCII编码去处理
文件的读写
Python2:
读取文件的结果为str类型的字节串,不会修改编码,写入时原样写入字节串。
Python3中的字符串:
读取文件的结果为str类型的并自动转化为unicode编码的字符串,写入的时候自动转化为文件的编码
其他
将内容为unicode形式的字符串,转换成真正的unicode字符串需要使用:str.decode(‘unicode-escape’)