python 字符编码转换(Python字符编码转换)
python 字符编码转换(Python字符编码转换)那问题继续来了,那每个国家都有自己的一套编码,那不是买了他国的设备,显示不出本国的字符了?GBK 中文编码,基本上表示所有的汉字,windows系统默认的其实就是这个编码。那问题来了,在我们中国,怎么表示中文呢?于是就有了下面的三种编码。GB2312 中文编码,好像只能存7000多个汉字GB18030 中文编码,好像能存2万多个汉字
关于字符的编码,这是一个及其重要的知识点,这个点不搞清楚,那改bug有时候你会晕的。我们下面就以Python为例来说说字符编码的问题。
我们常见的编码格式有ASCII、gbk、GB2312、UTF-8、GB18030和Unicode等等。
说明一下:
-
ASCII 只能表示英文和部分字符,占用1个字节
那问题来了,在我们中国,怎么表示中文呢?于是就有了下面的三种编码。
-
GB2312 中文编码,好像只能存7000多个汉字
-
GB18030 中文编码,好像能存2万多个汉字
-
GBK 中文编码,基本上表示所有的汉字,windows系统默认的其实就是这个编码。
那问题继续来了,那每个国家都有自己的一套编码,那不是买了他国的设备,显示不出本国的字符了?
于是乎,就有了ISO标准的万国码-------Unicode。
-
Unicode :就是所谓的万国码。他能显示全球各个地方的字符了。它1个中文字符或者一个英文字符占2字节。
要说这个Unicode好啊 ,都能存储了,可是问题又来了,我本身英文的字符我是用ASCII编码,只占用8bit,现在用你的Unicode要占用16bit。这不是扯了蛋了。使用英文字符的就不愿意了,要知道内存还是很贵的。这就出现了UTF-8。
-
UTF-8: 在Unicode的基础上出现了这种编码,UTF-8被称作可变长编码。可以认为是Unicode的一个扩展集,英文字符占用1个字节,中文占用3个字节。
有了这么多种编码,那么编码的转换就是一个很必然的问题了。
看一个很重要的图:
我们举个例子,假如现在要把韩国的一个软件运行在我们的机器上,假如这个软件使用的是x编码,我们知道不经过处理肯定是跑不起来的,这就需要一个转码的过程,这个过程是:x编码------>Unicode------>GBK。必须要有这个过程。x编码------>Unicode 这个过程一般称为解码(decode),Unicode------>GBK这个过程称为编码(encode)。反之,我们也需要这样一个过程。总之,转码的过程Unicode成了一个桥梁,转化成Unicode的过程一般称为decode。
在我们的python3中所有的编码都为utf-8。在python2中为ASCII。可使用该指令查询:
我们以python3x为例来说明一下:
这是我的pycharm的界面,注意右下角的编码格式为:UTF-8 这个表示我的这个程序使用的是UTF-8编码。
而在左侧输出栏里面的UTF-8表示的python3使用的默认编码是UTF-8。
我们把pycharm右下角的编码格式改为GBK。
写个简单的字符串,同志们报错了啊。这是为啥呢?我们先改一下再看:
第一张图为啥报错了呢?其实也很容易理解了,python3默认UTF-8编码,你现在把你的python文件设置为GDK编码,那肯定报错啊。但是我要是在程序的前面,
-
# -*-coding:gbk -*-
我们声明一下,我们使用gbk,程序就好了。这也是为啥我们在python2的时候开头总有这个设置文件编码的语句了。
那么问题来了,这个s是什么编码呢?其实这个s还是unicode编码。因为我们使用的是python3的解释器,默认的还是unicode或者叫做utf-8。这个# -*-coding:gbk -*-只是设置了你的文件的编码格式。它和运行的时候毛的关系都没有。这也是此时你不能再decode的原因了,我本身就是unicode,肯定就不能decode了。
-
我们来对s这个字符串编码一下:以gbk的格式啊
是不是又有疑问了?gbk编码竟然显示不出来这个字符串了,什么鬼?
其实这个是一个以byte类型编码gbk,显示不了这个字符串了。这个也是python3才有的。
在普及一下:Python 3对字符串和二进制数据流做了明确的区分。Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,你不能拼接字符串和字节流,也无法在字节流里搜索字符串(反之亦然),也不能将字符串传入参数为字节流的函数(反之亦然)。
-
以utf-8的格式编码一下s
依旧还是显示不出来字符串,显示的是以utf-8编码的“我爱你”这个字符串。
-
以gb2312的格式编码一下s
看看这个gb2312和gbk的编码是不是一样的,那是必然了,都是中文编码嘛,可以认为gb2312是gbk的一个子集。
我们再来看看decode和encode的语法格式:
encode:后面跟的参数是我要编码成的格式,例如:encode(“gbk”),表示我要编码成gbk格式。
decode:后面跟的参数是我现在的格式,例如:decode(“gbk”)表示我要将gbk编码的东西解码成unicode。
-
我们在转回字符串,让它显示“我爱你”
就说这么多了,有啥问题欢迎大家留言交流。
更多内容请关注头条号:小5嵌入式