字符串编码相关知识

一、编码的种类情况

 

  • ASCII 占1个字节,只支持英文
  • GB2312 占2个字节,支持6700+汉字
  • GBK GB2312的升级版,支持21000+汉字
  • Shift-JIS 日本字符
  • ks_c_5601-1987 韩国编码
  • TIS-620 泰国编码
  • Unicode 2-4字节
  • Unicode Transformation Format(UTF)1-4字节

二、   Unicode 与 UFT

  由于每个国家都有自己的编码规则,其仅涵盖本国字符,无其他国家字符的对应关系,所以Unicode(万国码)应运而生,它涵盖了全球所有的文字和二进制的对应关系。

 Unicode 起到2个作用:

  1. 直接支持全球所有语言,每个国家都可以不用再使用自己之前的旧编码了,用unicode就可以了。(就跟英语是全球统一语言一样)
  2. unicode包含了跟全球所有国家编码的映射关系。

  但是使用unicode表示一个字符,太浪费空间。例如:利用unicode表示“Python”需要12个字节才能表示,比原来ASCII表示增加了1倍为了解决存储和网络传输的问题,UTF便诞生了。

  • UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个。
  • UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
  • UTF-32: 使用4个字节表示所有字符

所以总的来说,UTF 是为unicode编码设计的一种在存储 和传输时节省空间的编码方案。

三、字符怎么存到硬盘上的?

  答:是按某种编码转换为二进制存储在硬盘上的。

  在此需要注意的是:以何种编码存到硬盘上,再从硬盘读取出来时,就必须以何种编码读,否则乱码就出现了。

四、编码转换 

  先来看看python3 执行代码的过程:

  1. 解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成unicode
  2. 把代码字符串按照语法规则进行解释
  3. 所有的变量字符都会以unicode编码声明

  我们知道,当你将一个以utf-8编码的程序拿到自己的Windows系统上运行,也是会乱码的,因为只有2种情况 ,你的windows上显示才不会乱:

  1. 字符串以GBK格式显示
  2. 字符串是unicode编码

当你的程序是GBK编码时,拿到国外的电脑上使用是会乱码的,因为人家根本不支持中文呀,那么怎么办呢,你有如下办法:

  1. 让美国人的电脑上都装上gbk编码
  2. 把你的软件编码以utf-8编码

>>可是以上两条路似乎都不好走啊,那该怎么办哩??

>>不要着急,山人自有妙计。你找一个既懂美国语言的,又懂中文的翻译官不就得了么!

>>这个翻译官是谁呢?

>>Unicode呀!

  是的,前面不是讲了,unicode支持全球所有语言,而且包含了跟全球所有国家编码的映射关系,所有系统、编程语言都默认支持unicode,所以可以把它作为一个转换器(翻译官),实现不同编码规则之间的转换。

具体方法就是,decode(解码) 和encode(编码),具体步骤如图:

代码(py3下运行):

s = "好好学习"
print(type(s))  # 打印字符串类型
s1 = s.encode("gbk")  # 编码
print(s1, type(s1))
s2 = s1.decode("gbk")  # 解码
print(s2, type(s2))

 运行结果:

<class 'str'>
b'\xba\xc3\xba\xc3\xd1\xa7\xcf\xb0' <class 'bytes'>
好好学习 <class 'str'>

 

当然,Python2并不会自动的把文件编码转为unicode存在内存里, 那就只能你自己人肉转。Py3 会自动把文件编码转为unicode存入内存。

五、Python3与Python2的编码区别

  Python3:

1、文件默认编码是utf-8;

2、字符串编码是unicode;

3、py3将str和bytes做了明确区分,str就是Unicode格式的字符串,bytes就是单纯的二进制。

  Python2:

1、文件默认编码是ASCII;

2、字符串编码是ASCII(如果文件头申明了gbk、utf-8等编码形式,则字符串的编码就是gbk、utf-8等格式);

3、在py2中unicode是一种单独的类型,使用是需要单独申明,如:s = u"美丽”;

4、在py2中,str和bytes两种类型界限比较模糊,可以说str就是bytes,bytes就是str。

 

python中常用bytes表示图片、视频等在编码规范中找不到对应字符串的二进制数据。

 

 

 

 

 

 

 

posted @ 2018-05-08 18:50  随风飘-挨刀刀  阅读(320)  评论(0编辑  收藏  举报
Top