作者:解琛
时间:2020 年 9 月 7 日
python教程 如何查看字符串编码
Python isinstance() 函数
python字符串编码
import chardet
str1 = "你好啊!"
print chardet.detect(str1)
输出如下。
{'confidence': 0.938125, 'language': '', 'encoding': 'utf-8'}
python 2.x 默认的字符编码是 ASCII,默认的文件编码也是 ASCII。
python 3.x 默认的字符编码是 unicode,默认的文件编码是 utf-8。
无论以什么编码在内存里显示字符,存到硬盘上都是二进制,所以编码不对,程序就会出错。
常见编码有:
需要注意的是,存到硬盘上时是以何种编码存的,再从硬盘上读出来时,就必须以何种编码读,要不然就会出现乱码问题。
常见的编码错误的原因有如下,出现乱码时,按照编码之前的关系,挨个排错就能解决问题。
Python支持中文的编码:utf-8、gbk 和 gb2312。
uft-8 为国际通用,常用有数据库、编写代码。
gbk 如 windows 的 cmd 使用。
如果想要中国的软件可以正常的在美国人的电脑上实现,有下面两种方法:
第一种方法不可现实,第二种方法比较简单,但是也只能针对新开发的软件,如果之前开发的软件就是以 gbk 的编码写的,上百万行代码已经写出去了,重新编码成utf-8格式也会费很大力气。
所以,针对已经用 gbk 开发的软件项目如何进行编码转换,利用 unicode 的一个包含了跟全球所有国家编码映射关系的功能,就可以实现编码转换。
无论以什么编码存储的数据,只要我们的软件把数据从硬盘上读到内存,转成 unicode 来显示即可,由于所有的系统、编程语言都默认支持 unicode,所有我们的 gbk 编码软件放在美国电脑上,加载到内存里面,变成了 unicode,中文就可正常展示。
转码过程如下:
这个标记出现在文件开头,它的作用是告诉 python 解释器此 .py 文件是 utf-8 编码,需要用 utf-8 的编码去读取这个 .py 文件。
Python2 将 string 处理为原生的 bytes 类型,而不是 unicode。
而 Python3 所有的 string 均是 unicode 类型。
#!/usr/bin/env python
# coding=utf-8
temp = '解琛' # UTF-8
temp_unicode =temp.decode('utf-8')
print temp_unicode
print isinstance(temp_unicode, unicode)
print type(temp_unicode)
temp_gbk = temp_unicode.encode('gbk')
print temp_gbk
print isinstance(temp_gbk, str)
print type(temp_gbk)
jerome = u"测试一下"
print jerome
print isinstance(jerome, unicode)
print type(jerome)
isinstance
函数来判断一个对象是否是一个已知的类型,类似 type
。
区别如下。
type
不会认为子类是一种父类类型,不考虑继承关系;isinstance
会认为子类是一种父类类型,考虑继承关系;isinstance
。输出内容如下。
解琛
True
<type 'unicode'>
����
True
<type 'str'>
测试一下
True
<type 'unicode'>
通过在字符串前面加一个 u
,可以指定字符串的编码为 unicode。
在转化字符串之前,需要使用 decode
来指定字符串的编码,然后使用 encode
将其转化为指定的编码格式。
现在我们面临了第一个问题:如何让人类语言,比如英文被计算机理解?
我们以英文为例,英文中有英文字母(大小写)、标点符号、特殊符号。如果我们将这些字母与符号给予固定的编号,然后将这些编号转变为二进制,那么计算机明显就能够正确读取这些符号,同时通过这些编号,计算机也能够将二进制转化为编号对应的字符再显示给人类去阅读。
由此产生了我们最熟知的 ASCII 码。
ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。
这样在大部分情况下,英文与二进制的转换就变得容易多了。
虽然计算机是美国人发明的,但是全世界的人都在使用计算机。现在出现了另一个问题:如何让中文被计算机理解?
中文不像拉丁语系是由固定的字母排列组成的,ASCII 码显然没办法解决这个问题。
为了解决这个问题,中国国家标准总局 1980 年发布《信息交换用汉字编码字符集》提出了 GB2312 编码,用于解决汉字处理的问题。
1995 年又颁布了《汉字编码扩展规范》(GBK)。
GBK 与 GB 2312—1980 国家标准所对应的内码标准兼容,同时在字汇一级支持 ISO/IEC10646—1 和 GB 13000—1 的全部中、日、韩(CJK)汉字,共计 20902 字。
这样我们就解决了计算机处理汉字的问题了。
全球有那么多的国家不仅有英文、中文还有阿拉伯语、西班牙语、日语、韩语等等。难不成每种语言都做一种编码?
基于这种情况一种新的编码诞生了:Unicode。
Unicode 又被称为统一码、万国码;它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Unicode 支持欧洲、非洲、中东、亚洲(包括统一标准的东亚象形汉字和韩国表音文字)。这样不管你使用的是英文或者中文,日语或者韩语,在 Unicode 编码中都有收录,且对应唯一的二进制编码。
这样大家都开心了,只要大家都用 Unicode 编码,那就不存在这些转码的问题了,什么样的字符都能够解析了。
但是,由于 Unicode 收录了更多的字符,可想而知它的解析效率相比 ASCII 码和 GB2312 的速度要大大降低,而且由于 Unicode 通过增加一个高字节对 ISO Latin-1 字符集进行扩展,当这些高字节位为 0 时,低字节就是 ISO Latin-1 字符。
对可以用 ASCII 表示的字符使用 Unicode 并不高效,因为 Unicode 比 ASCII 占用大一倍的空间,而对 ASCII 来说高字节的 0 毫无用处。
为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即 UTF(Unicode Transformation Format)。
而我们最常用的 UTF-8 就是这些转换格式中的一种。