1. 编码基础介绍

一、什么是字符编码。

要彻底解决字符编码的问题就不能不去了解到底什么是字符编码。计算机从本质上来说只认识二进制中的0和1,可以说任何数据在计算机中实际的物理表现形式也就是0和1,如果你将硬盘拆开,你是看不到所谓的数字0和1的,你能看到的只是一块光滑闪亮的磁盘,如果你用足够大的放大镜你就能看到磁盘的表面有着无数的凹凸不平的元件,凹下去的代表0,突出的代表1,这就是计算机用来表现二进制的方式。

1.ASCII

现在我们面临了第一个问题:如何让人类语言,比如英文被计算机理解?我们以英文为例,英文中有英文字母(大小写)、标点符号、特殊符号。如果我们将这些字母与符号给予固定的编号,然后将这些编号转变为二进制,那么计算机明显就能够正确读取这些符号,同时通过这些编号,计算机也能够将二进制转化为编号对应的字符再显示给人类去阅读。由此产生了我们最熟知的ASCII码。ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。这样在大部分情况下,英文与二进制的转换就变得容易多了。

2.GB2312

然而,虽然计算机是美国人发明的,但是全世界的人都在使用计算机。现在出现了另一个问题:如何让中文被计算机理解?这下麻烦了,中文不像拉丁语系是由固定的字母排列组成的。ASCII 码显然没办法解决这个问题,为了解决这个问题中国国家标准总局1980年发布《信息交换用汉字编码字符集》提出了GB2312编码,用于解决汉字处理的问题。1995年又颁布了《汉字编码扩展规范》(GBK)。GBK与GB 2312—1980国家标准所对应的内码标准兼容,同时在字汇一级支持ISO/IEC10646—1和GB 13000—1的全部中、日、韩(CJK)汉字,共计20902字。这样我们就解决了计算机处理汉字的问题了。

3.Unicode

现在英文和中文问题被解决了,但新的问题又出现了。全球有那么多的国家不仅有英文、中文还有阿拉伯语、西班牙语、日语、韩语等等。难不成每种语言都做一种编码?基于这种情况一种新的编码诞生了:Unicode。Unicode又被称为统一码、万国码;它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode支持欧洲、非洲、中东、亚洲(包括统一标准的东亚象形汉字和韩国表音文字)。这样不管你使用的是英文或者中文,日语或者韩语,在Unicode编码中都有收录,且对应唯一的二进制编码。这样大家都开心了,只要大家都用Unicode编码,那就不存在这些转码的问题了,什么样的字符都能够解析了。

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就是这些转换格式中的一种。在这里我们不去研究UTF-8到底是如何提高效率的,你只需要知道他们之间的关系即可。

总结:

1.为了处理英文字符,产生了ASCII码。
2.为了处理中文字符,产生了GB2312。
3.为了处理各国字符,产生了Unicode。
4.为了提高Unicode存储和传输性能,产生了UTF-8,它是Unicode的一种实现形式。

2. python编码转换的核心操作:

  • 任何编码的转换都需要经过一个Unicode作为中转编码。

  • python中的decode()方法就是用来将任何编码转换成Unicode。

3.python2.x 和 python3.x中默认编码

由于python3中的默认编码是utf-8,所以在python3中输入中文不需要添加字段:# -- coding: UTF-8 --

# python2.x
import sys
print(sys.getdefaultencoding())   # ascii# python3.x
import sys
print(sys.getdefaultencoding())   # utf-8

4.例子: 在python2中将utf-8编码转换成gbk

  • 首先将utf-8先转换成Unicode(在decode的时候为了让函数知道编码的来源类型需要将参数“utf-8”传入)

  • 再将上述结果encode成gbk

# -*- coding: UTF-8 -*-
import sys
print(sys.getdefaultencoding())s = "你好"
# >>>s
# '\xe4\xbd\xa0\xe5\xa5\xbd'
# 上述输出的是字节串
# 字节串是指该字符串在python中的标准形式,
# 也就是说无论一个字符串是什么样的编码,
# 在python中都会有一串字节串来进行表示。
# 字节串是没有编码的,对应的是最终交给计算机处理的数据形式。s_unicode = s.decode("utf-8")
# >>>s_unicode
# u'\u4f60\u597d'
# 上述输出的是字节串s_gbk = s_unicode.encode("gbk")
# >>>s_gbk
# '\xc4\xe3\xba\xc3'
# 上述输出的是字节串

【python】基础七:编码问题相关推荐

  1. python基础|字符编码

    任何一个程序想要运行,必须先有硬盘加载到内存,然后由cpu去内存取只执行.运行着的应用程序的数据,必须在内存运行.python运行文件的三步,首先把python文件解释器读取到内存上,然后应用程序代码 ...

  2. python基础七--集合

    12.22 1.昨日内容回顾 小数据池:int:-5--256str:1.不能有特殊字符2.*int不能超过20编码:所能看到的最小构成单位叫字符ascii : 8位 1字节 表示1个字符unicod ...

  3. 12道Python基础字符编码数据类型练习题

    1.转换 将字符串s = "alex"转换成列表 s = "alex" s_list = list(s) print(s_list) 将字符串s = " ...

  4. Python基础七(函数)

    函数概述 函数:组织好的.可重复使用的.杉树能提高应用的模块性和代码的重复利用性.Python提供了很多的内置函数,比如len()等等,可以自行定义函数. 函数的定义 def 函数名(参数列表):  ...

  5. python中输出变量对应值的字符_第2章 Python基础-字符编码数据类型 字符编码字符串 练习题...

    1.简述位.字节的关系 位(bit)是计算机中最小的表示单元,数据传输是以"位"为单位的,1bit缩写为1b 字节(Byte)是计算机中最小的存储单位,1Byte缩写为1B 8bi ...

  6. python基础七之copy

    浅拷贝 没有嵌套,则copy后完全不同,有嵌套,则copy后本体不同,嵌套相同. l1 = [1, 2, [4, 5, 6], 3] l2 = l1.copy() print(l1 is l2) # ...

  7. Python基础七(深浅copy以及int,str,tuple,list,dic补充)

    一:int,str,tuple,list,dic之间的转换及其补充 1.转换 1)int与str的转换 int ----> str str(int) str ----> int int(s ...

  8. 7.13 Python基础语法

    Python基础语法 编码: 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 当然你也可以为源码文件指定不同的编码 python2.7中有两个函数 ...

  9. Python基础语法、python基础数据类型、python解释器、python注释符、python-range()和sum()

    前段时间准备考研去了,没什么时间写博客,老师一番教诲,细想我这自考本的身份去考名校,万一没考上在这里白学了,到时候找工作也是个难事.细想自己的环境不容自己这么极端,也是自己把自己想的太美好了,怎么可能 ...

  10. Python基础数据类型---列表、元组、字典、集合、编码进价、数据类型转换

    文章目录 一.列表(List) 二.元组(tuple) 三.字典(dict) 四.集合(set) 五.数据类型间的转换 六.基础数据类型的总结 七.编码 八.练习题 一.列表(List) 列表是pyt ...

最新文章

  1. 上班第一天(1)--一个程序员的成长史(10)
  2. 阿里达摩院再造AI抗疫技术:20秒判读CT影像,识别准确率达96%,河南率先启用...
  3. Calendar.clear(int field)的陷阱
  4. TCP IP基础知识的复习
  5. GA,RC,Alpha,Beta,Final等软件版本名词释义
  6. 拖拽自动生成的DataGridView和BindingSource操作数据库(增加,修改,删除)---自己实现...
  7. jquery.autocomplete自动补齐和自定义格式
  8. 浅谈跨平台框架 Flutter 的优势与结构 1
  9. 【大数据】【Spark】Spark概述
  10. windows10彻底关闭自动更新
  11. 大数据IMF传奇行动绝密课程第91课:SparkStreaming基于Kafka Direct案例实战和内幕源码解密
  12. python实现汇率转换
  13. postman报错500 Internal Server Error
  14. HDU - 1173 采矿
  15. Kafka架构篇 - 多副本机制
  16. 计算机终端网络准入管理规定,网络准入与终端安全.doc
  17. 判断一个点是否在某个区域内(多边形)
  18. 三种典型的博弈论问题之巴什博奕(Bash Game)
  19. 基于迅为2K1000开发板龙芯处理器安装 Linux系统到固态硬盘
  20. 【解决方案】现代化工厂如何实现智能化视频管理?EasyNVR安防视频监控系统打造智慧工厂

热门文章

  1. C语言化学计算器(二)
  2. 火焰识别python_基于Python的火焰识别程序
  3. (转)iOS Wow体验 - 第四章 - 为应用的上下文环境而设计
  4. 对折纸张(蓝桥杯真题)
  5. 冰山一角,管窥中国互联网的地下世界
  6. 浅谈图数据库1:什么是图?
  7. Outlook分组后,为什么桌面和收件箱无提示
  8. vue实现textarea框,文字高度自适应
  9. 转义字符 lt; gt; 等等
  10. 斜度线在CAD中你是怎么画的?