字符编码表
⼀、了解字符编码表
⼀:计算机基础知识
1、程序运⾏与三⼤核⼼硬件(cpu,内存,硬盘)的关系:
任何⼀个程序都是先存放于硬盘上的,必须先由硬盘读取到内存,之后cpu去内存中取值然后执⾏
2、程序运⾏过程中产⽣的数据最先放在内存中,计算机内部存取的数据⽤的都是010*********的⼆进制
⼆、⽂本编辑器和python解释器运⾏原理
python程序运⾏的三个步骤
python3 D:\a.py
1、先启动python解释器
oracle11g安装windows2、解释器会将a.py的内容当成普通内存从硬盘读⼊内存,此时没有语法意义
3、解释器会解释执⾏刚刚读⼊内存的内存,开始识别python语法
任何⼀个程序都是先存放于硬盘上的,必须先由硬盘读取到内存,之后cpu去内存中取值然后执⾏
⽂本编辑器
1、打开编辑器就打开了启动了⼀个进程,是在内存中的,所以,⽤编辑器编写的内容也都是存放与内存中的,断电后数据丢失
2、要想永久保存,需要点击保存按钮:编辑器把内存的数据刷到了硬盘上。
3、在我们编写⼀个py⽂件(没有执⾏),跟编写其他⽂件没有任何区别,都只是在编写⼀堆字符⽽已。
总结
相同:1、任何的程序要想运⾏都是先从硬盘读取到内存
2、⽂本编辑器和python解释器都会去硬盘中读取你想要读取的内容
不同:1、⽂本编辑器将⽂件内容读取之后仅仅是展⽰给⽤户看
python解释器会识别语法并解释执⾏python代码
三、什么是字符编码
计算机所能识别的都是⼆进制01010101的数字,所以总结计算机只能认识数字
经历的过程:
字符-----(翻译过程)-----数字
这个过程实际就是⼀个字符如何对应⼀个特定数字的标准,这个标准称之为字符编码
四、字符编码表发展史
python 2.x默认的字符编码是ASCII,默认的⽂件编码也是ASCII。
python 3.x默认的字符编码是unicode,默认的⽂件编码是utf-8。
用scanf输入二维数组>excel数组的数值可以是公式1、ASCII:美国⼈发明的最早的只能识别英⽂字符
特点:采⽤8bit对应⼀个英⽂字符
8bit=》1Bytes
2、GBK:中国⼈发明的可以识别中⽂字符串与英⽂字符
特点:采⽤16bit对应字符,该字符可以是英⽂字符、也可以是中⽂字符
16bit = 》2Bytes
3、shift-JIS⽇本⼈发明的可以识别⽇⽂和英⽂字符
Euc-kr韩国⼈发明的可以识别韩⽂和英⽂字符
4、unicode:可以识别万国字符
特点:2Bytes对应⼀个字符
在unicode中对于是英⽂的⽂本来说,unicode⽆疑是多了⼀倍的存储空间(⼆进制最终都是以电或者磁的⽅式存储到存储介质中的)
于是产⽣了UTF-8(可变长,全称Unicode Transformation Format),对英⽂字符只⽤1Bytes表⽰,对中⽂字符⽤3Bytes,对其他⽣僻字⽤更多的Bytes去存
总结:内存中统⼀采⽤unicode,浪费空间来换取可以转换成任意编码(不乱码),硬盘可以采⽤各种编码,如utf-8,保证存放于硬盘或者基于⽹络传输的数据量很⼩,提⾼传输效率与稳定性。
字符-----》unicode格式的数字
GBK shiftJIS**
基于⽬前的现状,内存中的编码固定就是unicode,我们唯⼀可变的就是硬盘的上对应的字符编码。
1、
英⽂字符--------------内存:ASCII⼆进制数--------------->硬盘:ASCII⼆进制数
中⽂英⽂字符--------------内存:GBK⼆进制数--------------->硬盘:GBK⼆进制数
⽇⽂英⽂字符--------------内存:shiftJIS⼆进制数--------------->硬盘:shiftJIS⼆进制数
韩⽂英⽂字符--------------内存:Euc-Kr⼆进制数--------------->硬盘:Euc-Kr⼆进制数
2、
中⽂英⽂字符------------内存:unicode=gbk====>硬盘:GBK⼆进制数
⽇⽂英⽂字符------------内存:unicode=shifJIS>硬盘:shiftJIS⼆进制数
韩⽂英⽂字符------------内存:unicode=Euc-Kr=>硬盘:Euc-Kr⼆进制数
万国字符----------------内存:unicode=utf-8==>硬盘:utf-8⼆进制数
3、
万国字符----------------内存:unicode=utf-8==>硬盘:utf-8⼆进制数
万国字符----------------内存:utf-8==========================>硬盘:utf-8⼆进制数
在读⼊内存时,需要将utf-8转成unicode
所以我们需要明确:内存中⽤unicode是为了兼容万国软件,即便是硬盘中有各国编码编写的软件,unicode也有相对应的映射关系,但在现在的开发中,程序员普遍使⽤utf-8编码了。
乱码问题
⽆论以什么编码在内存⾥显⽰字符,存到硬盘上都是⼆进制,所以编码不对,程序就会出错。
1、存的时候乱了:采⽤的字符编码表⽆法识别输⼊的字符
血浪漫之崛起的小兵存的时候就已经乱了,是⽆法补救的,取的时候⼀定也乱了
解决⽅法:存⼊硬盘的编码格式应该⽤utf-8格式
2、存的时候没有乱码:采⽤的字符编码表可以识别输⼊的字符
但是取的时候乱码了:采⽤的字符编码表与当初存的时候⽤的不是同⼀张表
解决⽅法:存的时候⽤什么编码,取的时候⼀定要⽤同样的编码格式
与运⾏python程序有关的乱码问题:
1、保证运⾏python程序的前两个阶段不乱码
在python⽂件的开头加⼀⾏:
#coding:⽂件存的时候⽤的编码格式
#coding:gbk
python2.x的bytes与python3.x的bytes的区别
Python2将string处理为原⽣的bytes类型,⽽不是 unicode。⽽Python3所有的 string均是unicode类型。
怎么建立shell脚本在python2.x中,写字符串,⽐如
s = ”学习“
print s
学习
s # 字节类型
‘\xd1\xa7\xcf\xb0’
虽然说打印的是中⽂学习,但是直接调⽤变量s时,显⽰的却是⼀个个16进制表⽰的⼆进制字节,我们称这个为byte类型,即字节类型,它把8个⼆进制组成⼀个byte,⽤16进制表⽰。
所以说python2.x的字符串其实更应该称为字符串,通过存储的⽅式就能看出来,但是在python2.x中还有⼀个bytes类型,两个是否相同呢,回答是肯定的,在python2.x中,bytes==str。
python3.x中,把字符串变成了unicode,⽂件默认编码为utf-8。这意味着,只要⽤python3.x,⽆论我们的程序以那种语⾔开发,都可以在全球各国电脑上正常显⽰。
python3.x除了把字符串的编码改成了unicode,还把str和bytes做了明确区分,str就是unicode格式的字符串,⽽bytes就是单纯的⼆进制。(补充⼀个问题,在python3.x中,只要把unicode编码,字符串就会变成了bytes格式,也不直接打印成gbk的字符,我觉得就是想通过这样的⽅式明确的告诉你,想在python3.x中看字符串,必须是unicode,其他编码⼀律是bytes格式)。
深⼊中⽂编码问题
python3内部使⽤的是unicode编码,⽽外部却要⾯对千奇百怪的各种编码,⽐如作为中国程序经常要⾯对的gbk,gb2312,utf8等,那这些编码是怎么转换成内部的unicode呢?
⾸先看⼀下源代码⽂件中使⽤字符串的情况。源代码⽂件作为⽂本⽂件就必然是以某种编码形式存储代码的,python2默认源代码⽂件是asci编码,python3默认源代码⽂件是utf-8编码。⽐如给python2代码⽂件中的⼀个变量赋值:
s1 = ‘a’
print s1
python入门教程编辑器python2认为这个字符’a’就是⼀个asci编码的字符,这个⽂件可以正常执⾏,并打印出’a’字符。在仅仅使⽤英⽂字符的情况下⼀切正常,但是如果⽤了中⽂,⽐如:
s1 = ‘哈哈’
print s1
这个代码⽂件被执⾏时就会出错,就是编码出了问题。python2默认将代码⽂件内容当作asci编码处理,但asci编码中不存在中⽂,因此抛出异常。
解决问题之道就是要让python2解释器知道⽂件中使⽤的是什么编码形式,对于中⽂,可以⽤的常见编码有utf-8,gbk和gb2312等。只需在代码⽂件的最前端添加如下:
# -- coding: utf-8 --
这就是告知python2解释器,这个⽂件⾥的⽂本是⽤utf-8编码的。这样,python就会依照utf-8的编码形式解读其中的字符,然后转换成unicode编码内部处理使⽤。
不过,如果你在Windows控制台下运⾏此代码的话,虽然程序是执⾏了,但屏幕上打印出的却不是哈哈字。这是由于python2编码与控制台编码的不⼀致造成的。Windows下控制台中的编码使⽤的是gbk,⽽在代码中使⽤的utf-8,python2按照utf-8编码打印到gbk编码的控制台下⾃然就会不⼀致⽽不能打印出正确的汉字。
解决办法⼀个是将源代码的编码也改成gbk,也就是代码第⼀⾏改成:
# -- coding: gbk --
另⼀种⽅法是保持源码⽂件的utf-8不变,⽽是在’哈哈’前⾯加个u字,也就是:
s1=u’哈哈’
print s1
这样就可以正确打印出’哈哈’字了。这⾥的这个u表⽰将后⾯跟的字符串以unicode格式存储。python2会根据代码第⼀⾏标称的utf-8编码,识别代码中的汉字’哈哈’,然后转换成unicode对象。如果我们⽤type查看⼀下’哈哈’的数据类型type(‘哈哈’),会得到<type ‘str’>,⽽type(u’哈哈’),则会得到<type ‘unicode’>。
type(‘哈哈’)
<type ‘str’>
type(u’哈哈’)
<type ‘unicode’>
也就是在字符前⾯加u就表明这是⼀个unicode对象,这个字会以unicode格式存在于内存中,⽽如果不加u,表明这仅仅是⼀个使⽤某种编码的字符串,编码格式取决于python2对源码⽂件编码的识别,这⾥就是utf-8。
Python2在向控制台输出unicode对象的时候会⾃动根据输出环境的编码进⾏转换,但如果输出的不是unicode对象⽽是普通字符串,则会直接按照字符串的编码输出字符串,从⽽出现上⾯的现象。
使⽤unicode对象的话,除了这样使⽤u标记,还可以使⽤unicode类以及字符串的encode和decode⽅法。
unicode类的构造函数接受⼀个字符串参数和⼀个编码参数,将字符串封装为⼀个unicode,⽐如在这⾥,由于我们⽤的是utf-8编码,所以unicode中的编码参数使⽤’utf-8’,将字符封装为unicode对象,然后正确输出到控制台:
s1=unicode(‘哈’, ‘utf-8′)
print s1
另外,⽤decode函数也可以将⼀个普通字符串转换为unicode对象。很多⼈都搞不明⽩python2字符串的decode和encode函数都是什么意思。这⾥简要说明⼀下。
decode函数是将普通字符串按照参数中的编码格式进⾏解析,然后⽣成对应的unicode对象,⽐如在这⾥我们代码⽤的是utf-8,那么把⼀个字符串转换为unicode对象就是如下形式:
s2 = ‘哈哈’.decode(‘utf-8’)
type(s2)
<type ‘unicode’>
这时,s2就是⼀个存储了’哈哈’字符串的unicode对象,其实就和unicode(‘哈哈’, ‘utf-8′)以及u’哈哈’是
相同的。
encode函数正好就是相反的功能,是将⼀个unicode对象转换为参数中编码格式的普通字符串,⽐如下⾯代码:
复制代码
s3 = unicode(‘哈哈’, ‘utf-8’).encode(‘utf-8’)
type(s3)
<type ‘str’>
或者:
s3 = ‘哈哈’.decode(‘utf-8’).encode(‘utf-8’)
type(s3)
<type ‘str’>
复制代码
s3现在⼜变回了utf-8的’哈哈’。同样的,也可指定其它编码格式,但要注意的是,⽤什么格式编码,就⽤什么格式
解码,否则会出现中⽂乱码问题。
字符编码
⽬前使⽤的编码⽅式有:ASCII码(⼀个字节)、Unicode码(两个字节)、UTF-8码(可变长的编码)。我们已经知道了,字符串也是⼀种数据类型,但是,字符串⽐较特殊的是还有⼀个编码问题。
因为计算机只能处理数字,如果要处理⽂本,就必须先把⽂本转换为数字才能处理。最早的计算机在设计时采⽤8个⽐特(bit)作为⼀个字节(byte),所以,⼀个字节能表⽰的最⼤的整数就是255(⼆进制11111111=⼗进制255),如果要表⽰更⼤的整数,就必须⽤更多的字节。⽐如两个字节可以表⽰的最⼤整数是65535,4个字节可以表⽰的最⼤整数是4294967295。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论