python 字符编码识别及转换_JeromeCoco的博客-程序员宅基地_python自动识别编码

技术标签: 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 就是这些转换格式中的一种。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/JeromeCoco/article/details/108444271

智能推荐

Ps导航栏的简略讲解(一)_往玉的博客-程序员宅基地

一.Ps的导航栏在整个页面的左上方,从左往右依次是文件、编辑、图像、图层、文字、选择、滤镜、视图、窗口、帮助。二.因为导航栏的内容较多,所以此文章只是简略的讲解,如想看详细的讲解关注作者即可。三.文件:点击文件后会出现一个小框,里面的内容从上往下依次是新建、打开、在Bridge中浏览、在Mini Bribge 中浏览、打开为、打开为智能对象、最近打开文件、关闭、关闭全部、关闭并转到Birdge...、存储、存储为、签入、存储为Web所用格式、恢复、置入、导入、导出、自动、脚本、文件简介、..

基于Java的局域网群聊软件_BoilerHouseKing的博客-程序员宅基地

基于TCP/IP协议,包含一个客户端和一个服务器端。其实原理和大部分聊天工具相同的,少了花俏的界面,功能也很简单,客户端可以为繁体或者简体,目前只能字符聊天。主要功能:1.Server端:包括端口设置,语言设置,用户列表,踢人,向所有人发信息等功能。2.Client端:包括公聊,私聊。其中,给本人说的话会用蓝色字体显示出来,管理员发出来的会用黑色粗体显示出来。

程序员眼中的黑洞除了bug和秃头,还有什么..._mobilehub的博客-程序员宅基地

最近一张非常牛逼的照片在4月10日晚21点全球直播首发了!那就是——人类拍到的首张黑洞照片这则消息一下子席卷了全网热心网友们也开始纷纷展露自己的才华你以为你看到的黑洞是这...

计算机应用基础操作系统和网络应用形式,计算机应用基础WindowsXP操作系统_骆王宇的博客-程序员宅基地

计算机应用基础WindowsXP操作系统语音编辑锁定讨论上传视频《计算机应用基础》是2004年9月中央广播电视大学出版社出版的图书,作者是郑纬民。本书向学习者传授计算机基础知识和培养计算机应用能力的入门课程。其内容着重计算机的基础知识、基本概念和基本操作技能,并兼顾实用软件的使用和计算机应用领域的前沿知识。书名计算机应用基础WindowsXP操作系统作者郑纬民[1]ISBN9787...

vue开发调试时,如何分离出源代码(devtool配置)_laozhong110的博客-程序员宅基地_vue 代码分离

vue不同版本/cli不同版本,在调试,源代码断点时,分离出源代码方便查看,配置大致一致,这里记录一下。//vue.config.js 文件module.exports = {/*一般在configureWebpack配置,不要在chainWebpack里头配置,这个配置好些与cli有关,可能无效*/ configureWebpack:{ devtool: "cheap-module-eval-source-map", output: { ...

Android资源汇总_Helianthus_xiatian的博客-程序员宅基地

chrome上的书签越来越多,一直没有来得及整理,然后最近看到一个书签网(http://www.androidcat.com/)整理的内容,感觉很条理,而且他的整理在我的书签里也有很多,因此我打算将他的内容整合跟我的书签整合下,分享给大家资源文档http://www.androiddevtools.cn/ 主要提供各种Android开发工具http://developer.android.c

随便推点

Ubuntu重启黑屏无法进入GUI桌面_shu.xiao的博客-程序员宅基地_ubuntu安装fcitx后重启黑屏

#系统版本:Ubuntu20.04.3LTS#故障现象:重启进入系统gui界面黑屏,只有一个鼠标可以移动#解决办法:按住ctrl+f3进入tty,输入root及root用户密码登录系统sudo apt remove sogoupinyinsudo apt autoremovesufo apt remove fcitxsudoapt autoremove再次reboot重启就可以进入gui界面了#故障原因:因为要使用中文输入法,安装了fcitx输入法框架依赖包,尝试了三次,安装fcitx后的确

常见CPU调度算法_jrglinux的博客-程序员宅基地_cpu调度算法

CPU调度初衷:In a system with a single CPU core, only one process can run at a time. Others must wait until the CPU’s core is free and can be rescheduled. The objective of multiprogramming is to have some process running at all times, to maximize CPU utilizat

JavaScript面向对象编程之创建对象_BruceYuj的博客-程序员宅基地

背景工厂模式构造函数模式构造函数模式的具体使用将构造函数当做普通函数使用构造函数模式的问题原型模式理解原型对象原型对象与in操作符更简单的原型语法原型的动态性原生对象的原型原型对象的问题组合使用构造函数模式和原型模式动态原型模式寄生构造函数模式稳妥构造函数模式背景我们使用Object构造函数或对象字面量来创建单个对象。但是如果我们使用同一个接口创建很多对象的话,会产生

tensorflow自动写诗_weixin_30603633的博客-程序员宅基地

1、目录结构2、入口类# coding = utf-8"""注意:RNN使用的数据为序列化的数据RNN网络:主要由多个LSTM计算单元组成,依靠BPTT算法进行时序展开LSTM:含有保留门和忘记门,是一个多输入多输出的网络结构。LSTM具备抑制梯度特性"""# import numpy as np# import tensorflow as tf...

维修电工仪表照明实训考核装置_9#月芳的博客-程序员宅基地

ZN-81DDF维修电工仪表照明实训考核装置ZN-81DDF维修电工仪表照明实训考核装置是按照劳动和社会保障部颁发的“工人等级标准”和“职业技能鉴定”的要求而设计的,该装置集理论、实际操作和考核鉴定为一体的多功能设备。它不仅能作为电工仪表和照明电路的操作实训装置。而且也可用于劳动职业技能鉴定部门、大中专院校、职校、技校对初、中、高级维修电工技能考核的理想实训实验设备。一、装置特点:1.电气控制线路元器件都装在作为挂板的安装板上,操作方便、更换便捷,便于扩展功能或开发新实训,操作内容的选择具有典型性和

操作postgre数据库的python脚本_Ray_awakepure的博客-程序员宅基地

连接数据库通过建立connect对象的方式import psycopg2def establish_connection(host, port, dbname, user, password): """ 建立连接关系并返回连接对象 :return: 连接对象 """ try: conn_string = f"host={host} port={port} dbname={dbname} user={user} password={passwo