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的字符编码与解码问题(以点破面). 前言:字符串的编码 ...
随机推荐
- TypeScript 编译目标(target)设置
TypeScript的编译配置文件tsconfig.json中有许多配置项,本文简单对比编译目标环境的配置项(target)的设置.模块(module)不在本文讨论之内,是另外一个大话题. 实验对于t ...
- @Conditional注解
根据条件动态创建bean public class TestConditon implements Condition { public boolean matches(ConditionContex ...
- the property “***” on could not be set to a null value
在建立EF框架的时候,创建实体时由于部分数据库类型和.net类型不同,比如int类型,在数据库中是可空类型,而.net中是不允许的,所以创建实体的时候,数据库的int类型对应的实体类型应该为int?类 ...
- python 爬虫 基于requests模块的get请求
需求:爬取搜狗首页的页面数据 import requests # 1.指定url url = 'https://www.sogou.com/' # 2.发起get请求:get方法会返回请求成功的响应对 ...
- mysql一个SQL案例
需求 : 测试数据 ),start1 int,end1 int); ,); ,); ,); ,); ,); ,); 解决: 解决2: 解决代码 核心思想,把符合逻辑条件的行,构造相同分组 select ...
- MYSQL—第二部分(Linux版本的安装和数据表的操作)
Linux版本的安装(过于简单了) 安装: ? 1 yum install mysql-server 服务端启动 ? 1 mysql.server start 客户端连接 ? 1 2 3 4 5 6 ...
- dual Oracle兼容
CREATE OR REPLACE VIEW dual ASSELECT NULL::"unknown"WHERE 1 = 1;
- C++ 的关键字(保留字)完整介绍
转载至:https://www.runoob.com/w3cnote/cpp-keyword-intro.html 1. asm asm (指令字符串):允许在 C++ 程序中嵌入汇编代码. 2. a ...
- MySQL的事务和锁
MySQL的事务和锁 阅读目录 什么是事务 事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作:这些操作作为一个整体一起向系统提交,要么都执行.要么都不执行:事务是一组不可再 ...
- 面试题1-十进制数转化为十六进制数,不使用hex方法
问题: 给定一个整数,写一个算法将它转换为16进制,对于负数,可以使用two’s complement方法 def tohex(num): """十进制数转十六进制数&q ...