python字符编码与转码
注意:unicode和utf-8之间不需要转换,可以直接互相打印,GBK如果需要和utf-8之间进⾏转换⼀定要通过unicode
pycharm的默认编码如果不指定则会取系统的编码集,windows是默认gbk的
转换编码只在2进制⽂件解码编码中必须指定,如果⽂本⽂件指定encoding则会报错
s="你好"#python 默认的编码为unicode因此,所有的字符串的编码均为unicode
de("gbk"))#编码后,字符串的数据类型转变为2进制,打印的结果就是⼆进制的编码de("gbk"))
de("utf-8"))
de("utf-8").decode("utf-8").encode("gb2312"))#把utf-8编码先解码为unicode(写utf-8表⽰原编码为utf-8),然后重新编码为gb2312
输出:
b'\xc4\xe3\xba\xc3'
b'\xe4\xbd\xa0\xe5\xa5\xbd'
b'\xc4\xe3\xba\xc3'
wwwblogs/luotianshuai/articles/5735051.html
在2.7环境中咱们要写上这⼀⾏#-*- coding:utf-8 -*-  为什么我们要加这⼀⾏呢?这⼀样的意思是置顶编码类型为utf-8编码!
⾸先在看这个问题之前,咱们是否曾想过⼀个问题?
为什么我们可以在显⽰器上能看到这些⽂字、数字、图⽚、字符、等等信息呢?⼤家都知道计算机本⾝只能识别 0  1 的组合,他们是怎么展⽰这些内容的呢?我们怎么和计算机去沟通呢?
如果我们使⽤0 1 的组合和计算机沟通你还能看到这些内容吗?还有⼀个问题就是01的组合对于咱们说⼏乎看不懂对吧!
那怎么办?如何让计算机理解我们的语⾔,并且我们能理解计算机的语⾔呢?
举个⽐较形象的例⼦,中英⽂词典对照表,这样我们就可以把中英⽂进⾏互相的翻译了呢?对不对!同理计算机也是这样的他需要⼀个标准的对照关系,那么这个标准最早叫什么呢?ASCII表
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于的⼀套电脑编码系统,主要⽤于显⽰现代和其他语⾔。它是现今最通⽤的单系统,并等同于标准ISO/IEC 646。
咱们看下这张表:
有特殊符号、⼤写字母、⼩写字母、数字(这⾥注意下0~9的数字是字符),在这些字符左边都有⼀个10进制的数字。但是对于10进制来说计算机他也是不能理解的,因为他只能理解0 1 ,但是10进制和2进制的转换就⾮常容易了!
点击我之前写过的⼀篇⽂章来查看:
举例来说:如果我在键盘上按⼀个A字母的时候那么实际是给计算机传输了⼀个数字65,通过这样的机制和计算机沟通,有了这个ASCII码表就可以和任何计算机进⾏沟通了。NICE
这⾥在看个知识点:计算机中最⼩的单位是什么?bit  bit就咱们常说⼀位⼆进制,⼀位⼆进制要么是0 要么是 1
但是bit这个单位太⼩了,我们⽤字节(byte)来表⽰。他们是有换算的规则的(看下⾯的规则我想⼤家都不是很陌⽣对吧):
8b = 1B  #⼩b=bit ;⼤B=byte
1024B = 1KB
1024KB = 1M
1024M = 1G
1024G = 1T
'''
在存储英⽂的时候我们⾄少需要1个字节(⼀个字母),就是8位(bit),看下ASCII表中1个字节就可以表⽰所有的英⽂所需要的字符,是不⾮常⾼效!
为什么呢?早期的计算机的空间是⾮常宝贵的!
那你会发现1个字节8位,他能存储的最⼤数据是2的8次⽅-1 = 255,⼀个字节最多能表⽰255个字符那西⽅国家他们使⽤了127个字符,那么剩下字符是做什么的呢?就是⽤来做扩展的,西⽅⼈考虑到还有其他国家。所以留下了扩展位。
但是呢有问题,计算机是西⽅⼈发明的,如果仅仅⽀持英⽂的话,这127个字符完全就可以表⽰所有英⽂中能⽤的的内容了。但是他没有考虑咱们⼤中国啊!ASCII到了中国之后发现:咱们中国最常⽤的中⽂都有6000多个完全不够⽤啊!
但是怎们办?中国⼈⾮常聪明:就在原有的扩展位中,扩展出⾃⼰的gbk、gb2312、gb2318字符编码。
他是怎么扩展的呢?⽐如说在ASCII码中的128这个位置,这个位置⼜指定⼀张单独表,聪明吧!其他国家也是这样设计的!
中国东亚⼤国是吧,我们国家⽐较NB,我要兼容其他国家的常⽤的编码!⽐如韩国⽇本,因为韩国和⽇本⼈家都有⾃⼰的编码,⼈家根本就不鸟你,举个例⼦来说,⽐如韩国的游戏,在中国下载安装之后会出现乱码的情况?什么⿁?
这种乱码的出现基本上就两种情况:
1、字符编码没有
2、字符编码冲突了,⼈家在写这个程序的时候指定的字符集和咱们使⽤的字符集的位置不对。 0 0 !
你想想不光是亚洲国家这样,欧洲国家,⾮洲国家都会存在这个问题,基于这个乱象国际互联⽹组织就说你们各个国家都别搞了,我们给你们搞⼀个统⼀的,这个统⼀的是什么呢Unicode“万国编码”,
Unicode(统⼀码、万国码、单⼀码)是⼀种在计算机上使⽤的字符编码。Unicode 是为了解决传统的字符编码⽅案的局限⽽产⽣的,它为每种语⾔中的每个字符设定了统⼀并且唯⼀的⼆进制编码,
规定虽有的字符和符号最少由 16 位来表⽰(2个字节),即:2 **16 = 65536,注:此处说的的是最少2个字节,可能更多。
这⾥还有个问题:使⽤的字节增加了,那么造成的直接影响就是使⽤的空间就直接翻倍了!举例还说:同样是ABCD这些字符存储⼀篇相同的⽂章,使⽤ASCII码如果是1M的话,那么Unicode存储⾄少2M可能还会更多。
为了解决个问题就出现了:UTF-8编码
UTF-8编码:是对Unicode编码的压缩和优化,他不再使⽤最少使⽤2个字节,⽽是将所有的字符和符号进⾏分类:ascii码中的内容⽤1个字节保存、欧洲的字符⽤2个字节保存,东亚的字符⽤3个字节保存...
通过这种可扩展的⽅式来存储。
OK 上⾯了解了:
1、什么ASCII编码
2、什么Unicode编码
3、什么UTF-8编码
回顾下乱码的出现原因:1、没有字符集 2、字符集冲突
回过头来看下为什么需要在第⼆⾏加上指定编码呢?在2.x版本的Python中Pyton在解释.py⽂件的时候,默认是给他⼀个编码的就是ASCII 码,so如果在2.7版本中如果你不指定编码并且在.py⽂件中写了⼀个ASCII码中没有的字符就会显⽰乱码 0 0 !
不过这个问题在Python3中就不存在了,因为在Python3中默认就是Unicode编码。。。。。
Python编码转换
有⼀个问题,既然有统⼀的Unicode编码了,为⽑还需要编码转换?⼤家都统⼀⼀个编码不就可以了吗?
1、
不要问我为什么,我问你们个问题,如果世界上出了⼀种世界语⾔,你会放弃中⽂吗?去使⽤这个世界通⽤语⾔吗?这就是个坑,是个遗留问题。
但是虽然以后可能世界语⾔会慢慢替代咱们常⽤的语⾔,⼤家以后沟通就使⽤世界语⾔就不会有沟通障碍了对吧。(就是举个例⼦)
2、
还有⼀个情况是什么呢?韩国的游戏到中国来之后,是乱码?结合上⼀个回答咱们可以猜出:编写这个游戏的⼈在编写游戏的时候可能根本就没有考虑出⼝其他国家。那如果没有这个Unicode编码的话,到咱们这⾥来显⽰肯定是乱码是吧。
那就得需要通过转码把他们编码集,转换为Unicode(utf-8)编码集。这样他们就可以正常显⽰韩⽂了!(这⾥只是转编码集并不是翻译成中⽂不要弄混了~~!)
⼀、Python3中的编码转换
#因为在Python3中默认就是unicode编码
#!/usr/bin/env python
#-*- coding:utf-8 -*-
#author luotianshuaipython中的字符串是什么
tim = '天帅'
#转为UTF-8编码
de('UTF-8'))
#转为GBK编码
de('GBK'))
#转为ASCII编码(报错为什么?因为ASCII码表中没有‘天帅’这个字符集~~)
de('ASCII'))
⼆、Python2.X中的编码转换
#因为在python2.X中默认是ASCII编码,你在⽂件中指定编码为UTF-8,但是UTF-8如果你想转GBK的话是不能直接转的,的需要Unicode 做⼀个转接站点。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
#author luotianshuai
import chardet
tim = '你好'
print chardet.detect(tim)
#先解码为Unicode编码,然后在从Unicode编码为GBK new_tim = tim.decode('UTF-8').encode('GBK')
print chardet.detect(new_tim)
#结果
'''
{'confidence': 0.75249999999999995, 'encoding': 'utf-8'} {'confidence': 0.35982121203616341, 'encoding': 'TIS-620'} '''

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。