Python 2中万恶的字符编码
Python2中如果文件存在中文,必须要指定#-*- coding:utf8 -*-或#coding:utf8,否则会报错。那这是为什么呢?
一、原理解析
我们知道,在计算机发展初期,计算机只能识别字母,数字和一些基本符号,其使用8位存储空间存储所有的内容,也就是2^8=256个不同的结果,这就是ASCII码。在当时的情况下,并没有想到日后其他语言文字的扩展,随着不断的发展,对计算机的使用越来越广泛,使用8位存储空间早已不能满足人们的日常需求,所以Unicode(万国码)就这样诞生了。顾名思义,Unicode包含了所有国家所有不同的文字,它的存储空间由8位存储空间提升到了至少16位存储空间,也就是至少2^16=65536个不同的结果,这足以满足人们日常的需要,这就恰恰是Python2中使用的字符编码,但是问题又随之而来,如果在初期使用ASCII字符编码保存数字1,那么它的存储方式为0000001;而使用Unicode保存数字1的话,那么存储方式就扩大为00000000 00000001,虽然这样存储的数据没有任何问题,但是会白白浪费了很大的空间。聪明的人们又针对Unicode发明了UTF-8、 GBK、GB2312等字符编码,这类字符编码都是针对Unicode编码的进一步优化,它们都处于同一级的字符编码。以UTF-8字符编码为例来说能够满足存储于ASCII字符编码的(数字、字符、字母)都会按照8位存储空间存储,当遇到欧洲文字时会选择16位存储空间进行存储,也就是两个字节存储,当遇到汉字会使用24位存储空间存储,也就是三个字节存储。由此可以看出,UTF-8、GBK等相比对Unicode它是对其一个优化,针对存储不同的文字,使用不同的存储空间位数。
从上可知,在Python2中文件起始要明确指定字符编码,如果不指定系统会直接报错,而这就涉及到了字符编码的转换问题:当从UTF-8字符编码转换到GBK字符编码是不能够直接转换的,需要从UTF-8编码执行decode方法进行解码操作,此时的字符编码已转换为Unicode,然后再将Unicode编码使用encode方法进行编码操作,转换为GBK字符编码。之所以说Python2中字符编码让人头疼,指的就是UTF-8同级的字符编码转换GBK同级的字符编码,需要用到Unicode字符编码来进行转化。(参考下图)
在Python3中默认全局指定UTF-8字符编码,即使没有指定字符编码设置,依然能够正常的打印输出;在Python中不存在解码操作的必要,但仍需要编码操作。
二、总结
Python2中的不同字符编码之间如果需要相互转换,需要借助Unicode来完成,不能做到不同字符编码之间的相互转换;而这点在Python3中已经得到优化,将所有字符编码默认设置为UTF-8,彻底解决了因为字符编码头疼的问题。
Python 2中万恶的字符编码的更多相关文章
- Python : 熟悉又陌生的字符编码(转自Python 开发者)
Python : 熟悉又陌生的字符编码 字符编码是计算机编程中不可回避的问题,不管你用 Python2 还是 Python3,亦或是 C++, Java 等,我都觉得非常有必要厘清计算机中的字符编码概 ...
- python全栈开发-Day7 字符编码总结
python全栈开发-Day7 字符编码总结 一.字符编码总结 1.什么是字符编码 人类的字符--------->翻译--------->数字 翻译的过程遵循的标准即字符编码(就是一个字符 ...
- Python编程笔记二进制、字符编码、数据类型
Python编程笔记二进制.字符编码.数据类型 一.二进制 bin() 在python中可以用bin()内置函数获取一个十进制的数的二进制 计算机容量单位 8bit = 1 bytes 字节,最小的存 ...
- Java web应用中的常见字符编码问题的解决方法
以下是 Java Web应用的常见编码问题 1. html页面的编码 在web应用中,通常浏览器会根据http header: Content-type的值来决定用什么encoding, 比如遇到Co ...
- [转载]Java web应用中的常见字符编码问题的解决方法
以下是 Java web应用的常见编码问题 1. html页面的编码 在web应用中,通常浏览器会根据http header: Content-type的值来决定用什么encoding, 比如遇到Co ...
- Python中文文件处理中涉及的字符编码及字符集
在现在的互联网,字符编码是互联网信息交互的一个重要基础,各种语言都有支持信息编码的机制,Python也不例外.Python除了字符编码之外,对于字节码和字符串两种类型有严格区分,字符串是本地可以读取的 ...
- python学习第四天 --字符编码 与格式化及其字符串切片
字符编码 与格式化 第三天已经知道了字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采 ...
- python基础(三)----字符编码以及文件处理
字符编码与文件处理 一.字符编码 由字符翻译成二进制数字的过程 字符--------(翻译过程)------->数字 这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之 ...
- Python2/3的中、英文字符编码与解码输出: UnicodeDecodeError: 'ascii' codec can't decode/encode
摘要:Python中文虐我千百遍,我待Python如初恋.本文主要介绍在Python2/3交互模式下,通过对中文.英文的处理输出,理解Python的字符编码与解码问题(以点破面). 前言:字符串的编码 ...
随机推荐
- JavaScript DOM 编程艺术(第二版) 常用JS小脚本
function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') ...
- selenium知识思维导图|从元素定位到操作断言,助你快速入门自动化测试
为什么要进行自动化测试? 缩短测试周期,节省成本. 避免人为出错,提高准确性和可靠性. 获取需求覆盖率,代码覆盖率,提供衡量软件质量的指标. 自动化测试的条件? 手工测试完成后. 项目周期长,需求稳定 ...
- 【HANA系列】SAP HANA SQL取表中每行最小值
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL取表中每 ...
- Django-ORM之聚合和分组查询、F和Q查询、事务
聚合查询 聚合对查询的结果进行一步的计算加工. aggregate()是QuerySet 的一个终止子句 ,他的作用是,返回一个包含一些键值对的字典.键的名称是聚合值的标识符,值是计算出来的聚合值.键 ...
- 流程控制,循环结构,for,while循环
'''1.变量名命名规范 -- 1.只能由数字.字母 及 _ 组成 -- 2.不能以数字开头 -- 3.不能与系统关键字重名 -- 4._开头有特殊含义 -- 5.__开头__结尾的变量,魔法变量 - ...
- 阿里云Zabbix安装实践过程
1.配置阿里云zabbix yum源 [root@VM_0_8_centos ~]# rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/3.0/rhe ...
- 切换windows系统输入法的中英文,可以忽视是哪种打字法
调用windows的API //用户获取当前输入法句柄 [DllImport("imm32.dll")] public static extern IntPtr ImmGetCon ...
- Emgu 学习之HelloWorld
安装和配置 系统Win10,VS2013,下载Emgu安装包libemgucv-windesktop-3.4.3.3016 安装到了E:\OpenCV\emgucv-windesktop 3.4.3. ...
- HTML笔记(三) 表格和列表
本篇记录表格 (table) 和有序列表 (ordered list) \ 无序列表 (unordered list) 的部分用法 1.表格table 表格标签 使用 <table> 定义 ...
- 【STM32】STM32串口配置的一般步骤(库函数)
STM32串口配置的一般步骤(库函数)(1)串口时钟使能:RCC_APBxPeriphClockCmd(); GPIO时钟使能:RCC_AHBxPeriphClockCmd();(2)引脚复用映 ...