作者:解琛
时间:2020 年 9 月 7 日

  • 一 、默认编码
  • 二、中文乱码问题
  • 三、编码转换
  • 四、\#\_\*\_coding:utf-8\_\*\_ 的作用
  • 五、案例
  • 六、编码方式
    • 6.1 ASCII
    • 6.2 GB2312
    • 6.3 Unicode
    • 6.4 UTF-8

python教程 如何查看字符串编码
Python isinstance() 函数
python字符串编码

一 、默认编码

import chardetstr1 = "你好啊!"
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-8temp = '解琛'   # 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 就是这些转换格式中的一种。

python 字符编码识别及转换相关推荐

  1. (转载)Python常见字符编码间的转换

    Python常见字符编码间的转换 主要内容:     1.Unicode 和 UTF-8的爱恨纠葛     2.字符在硬盘上的存储     3.编码的转换     4.验证编码是否转换正确     5 ...

  2. python转换字符编码_Python常见字符编码间的转换

    学习Python,字符编码间的转换是绕不过去的一只拦路虎,不把编码彻底搞明白,总有一天它会猝不及防坑你一把. Python2.x和Python3.x在字符编码的设置上也有很大区别(Python3未来将 ...

  3. python字符编码在哪里_快速入手Python字符编码

    前言 对于很多接触python的人而言,字符的处理和语言整体的温顺可靠相比显得格外桀骜不驯难以驾驭. 文章针对Python 2.7,主要因为3对的编码已经有了很大的改善并且实际原理一样,更改一下操作命 ...

  4. python 字符编码处理_浅析Python 字符编码与文件处理

    Python字符编码 目前计算机内存的字符编码都是Unicode,目前国内的windows操作系统采用的是gbk. python2默认的字符编码方式是ASCII python3默认的字符编码方式是Un ...

  5. 天池-街景字符编码识别2-数据读取与数据扩增

    本此使用[定长字符识别]思路来构建模型 赛题地址 零基础入门CV赛事- 街景字符编码识别 关于更详细的数据预处理可=可以参考我的另一篇博文: 卷积神经网络性能优化(提高准确率) 2 数据读取与数据扩增 ...

  6. 转1:Python字符编码详解

    Python27字符编码详解 声明 一 字符编码基础 1 抽象字符清单ACR 2 已编码字符集CCS 3 字符编码格式CEF 31 ASCII初创 311 ASCII 312 EASCII 32 MB ...

  7. 天池大赛:街景字符编码识别——Part2:数据读取与数据扩增

    街景字符编码识别 更新流程↓ Task01:赛题理解 Task02:数据读取与数据扩增 Task03:字符识别模型 Task04:模型训练与验证 Task05:模型集成 底到镜一 比赛链接 Part2 ...

  8. 零基础入门CV赛事—街景字符编码识别—task2数据读取与扩增

    数据读取与扩增 上节学习了街景字符编码识别的解题思路,让我们对本赛题有了基本的idea,这节在定长字符编码的思路基础上学习读取数据和数据扩增. 图像数据读取 由于赛题数据是图像数据,赛题的任务是识别图 ...

  9. 计算机视觉实践(街景字符编码识别)-Task2 数据读取与数据扩增

    计算机视觉实践(街景字符编码识别)-Task2 数据读取与数据扩增 2.1.数据读取与数据扩增 本章主要内容为数据读取.数据扩增方法和Pytorch读取赛题数据三个部分组成. 2.1 学习目标 学习P ...

  10. python 字符编码问题

    字符编码 一.字符编码的演进 ASCII GB2312    GBK1.0    GB18030 Unicode编码:国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言.跨平台 ...

最新文章

  1. java的设计模式 - Builder模式
  2. 专访 | 执拗、纯粹的网易阮良,和他的梦想团队
  3. 深入理解计算机操作系统(一)
  4. html app从上向下弹框,移动端从底部向上过渡弹出弹框
  5. C++STL总结笔记(二)——仿函数(函数对象)
  6. 请分析比较下列四种染料在相同浓度和相同温度的水染液中的聚集度大小?
  7. jquery $(this)和this
  8. java 常用流_Java流类图结构: 流的概念和作用流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数...
  9. 经济学原理 下载 曼昆_2021南开经济学考研全年规划
  10. RabbitMQ实现生产者发送消息异步confirm
  11. Scikit-learn 秘籍 第三章 使用距离向量构建模型
  12. 芬兰称议员的邮件账户遭黑客访问
  13. win7计算机不能设置双屏怎么回事,Win7系统怎么设置才能实现双屏显示?
  14. 2022年智能马桶行业发展趋势
  15. win10点鼠标右键一直转圈好卡怎么办
  16. 关于计算机英语演讲ppt模板,英语演讲ppt模板(英语演讲8分钟ppt模板) 最新免费版...
  17. S3C2440之裸机之C语言按键点亮LED灯
  18. 蓝桥杯 算法训练 区间k大数查询 --c++
  19. 第12章、类和动态内存分配
  20. 在线调试摄像头 网页测试摄像头

热门文章

  1. 最大流最小割算法证明
  2. 微信收款播报器提示服务器断开,微信收款语音提醒开启后收不到语音提醒怎么办? 专家详解...
  3. rog live service是什么_「评测」三模无线,微动随心换,华硕ROG 烈刃2满足所有游戏需求...
  4. 面向对象编程三大特性------封装、继承、多态
  5. Milvus 在 AVX-512 与 AVX2 的性能对比
  6. 如何利用ICEPAK进行热仿真分析,简单易学
  7. 睿智的目标检测51——Tensorflow2搭建yolo3目标检测平台
  8. magisk卸载内置软件_红米Note7 MIUI12 10.15版 主题和谐 Magisk 省电稳定 迅雷会员
  9. min函数python_python内置函数之min
  10. 机器视觉入门,网友推荐的书目