python 字符编码识别及转换

作者:解琛
时间: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。

二、中文乱码问题

无论以什么编码在内存里显示字符,存到硬盘上都是二进制,所以编码不对,程序就会出错。

常见编码有:

  • ascii编码(美国);
  • GBK 编码(中国);
  • shift_JIS 编码(日本);
  • unicode(统一编码)等。

需要注意的是,存到硬盘上时是以何种编码存的,再从硬盘上读出来时,就必须以何种编码读,要不然就会出现乱码问题。

常见的编码错误的原因有如下,出现乱码时,按照编码之前的关系,挨个排错就能解决问题。

  • python 解释器的默认编码;
  • Terminal 使用的编码;
  • python 源文件文件编码;
  • 操作系统的语言设置。

Python支持中文的编码:utf-8、gbk 和 gb2312。

uft-8 为国际通用,常用有数据库、编写代码。

gbk 如 windows 的 cmd 使用。

三、编码转换

如果想要中国的软件可以正常的在美国人的电脑上实现,有下面两种方法:

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

第一种方法不可现实,第二种方法比较简单,但是也只能针对新开发的软件,如果之前开发的软件就是以 gbk 的编码写的,上百万行代码已经写出去了,重新编码成utf-8格式也会费很大力气。

所以,针对已经用 gbk 开发的软件项目如何进行编码转换,利用 unicode 的一个包含了跟全球所有国家编码映射关系的功能,就可以实现编码转换。

无论以什么编码存储的数据,只要我们的软件把数据从硬盘上读到内存,转成 unicode 来显示即可,由于所有的系统、编程语言都默认支持 unicode,所有我们的 gbk 编码软件放在美国电脑上,加载到内存里面,变成了 unicode,中文就可正常展示。

转码过程如下:

  • 源有编码 -> unicode编码 -> 目的编码
  • decode(“UTF-8”) 解码 --> unicode --> encode(“gbk”) 编码

四、#_*_coding:utf-8_*_ 的作用

这个标记出现在文件开头,它的作用是告诉 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 将其转化为指定的编码格式。

六、编码方式

6.1 ASCII

现在我们面临了第一个问题:如何让人类语言,比如英文被计算机理解?

我们以英文为例,英文中有英文字母(大小写)、标点符号、特殊符号。如果我们将这些字母与符号给予固定的编号,然后将这些编号转变为二进制,那么计算机明显就能够正确读取这些符号,同时通过这些编号,计算机也能够将二进制转化为编号对应的字符再显示给人类去阅读。

由此产生了我们最熟知的 ASCII 码。

ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。

这样在大部分情况下,英文与二进制的转换就变得容易多了。

6.2 GB2312

虽然计算机是美国人发明的,但是全世界的人都在使用计算机。现在出现了另一个问题:如何让中文被计算机理解?

中文不像拉丁语系是由固定的字母排列组成的,ASCII 码显然没办法解决这个问题。

为了解决这个问题,中国国家标准总局 1980 年发布《信息交换用汉字编码字符集》提出了 GB2312 编码,用于解决汉字处理的问题。

1995 年又颁布了《汉字编码扩展规范》(GBK)。

GBK 与 GB 2312—1980 国家标准所对应的内码标准兼容,同时在字汇一级支持 ISO/IEC10646—1 和 GB 13000—1 的全部中、日、韩(CJK)汉字,共计 20902 字。

这样我们就解决了计算机处理汉字的问题了。

6.3 Unicode

全球有那么多的国家不仅有英文、中文还有阿拉伯语、西班牙语、日语、韩语等等。难不成每种语言都做一种编码?

基于这种情况一种新的编码诞生了:Unicode。

Unicode 又被称为统一码、万国码;它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

Unicode 支持欧洲、非洲、中东、亚洲(包括统一标准的东亚象形汉字和韩国表音文字)。这样不管你使用的是英文或者中文,日语或者韩语,在 Unicode 编码中都有收录,且对应唯一的二进制编码。

这样大家都开心了,只要大家都用 Unicode 编码,那就不存在这些转码的问题了,什么样的字符都能够解析了。

6.4 UTF-8

但是,由于 Unicode 收录了更多的字符,可想而知它的解析效率相比 ASCII 码和 GB2312 的速度要大大降低,而且由于 Unicode 通过增加一个高字节对 ISO Latin-1 字符集进行扩展,当这些高字节位为 0 时,低字节就是 ISO Latin-1 字符。

对可以用 ASCII 表示的字符使用 Unicode 并不高效,因为 Unicode 比 ASCII 占用大一倍的空间,而对 ASCII 来说高字节的 0 毫无用处。

为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即 UTF(Unicode Transformation Format)。

而我们最常用的 UTF-8 就是这些转换格式中的一种。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

解琛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值