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的字符编码与解码问题(以点破面). 前言:字符串的编码 ...
随机推荐
- 谷歌云服务器XShell登录
一,谷歌云服务器,默认用浏览器进行SSH链接,而且也不告知密码.以Centos为例,先使用浏览器连接 1,给root修改密码 sudo passwd root 2,编辑ssh配置文件 sudo nan ...
- CentOS(Oracle_Linux)系统网卡配置文件参数详解
Each physical and virtual network device on an Oracle Linux system has an associated configuration f ...
- java:shiroProject
1.backend_system Maven Webapp: LoginController.java: package com.shiro.demo.controller; import org ...
- XML模块,面向对象思想与类的定义
今日内容 XML模块,面向对象思想,类的定义 1.XML模块 xml是一种可扩展的标记语言格式如下 使用 <> 作为标签格式 <tag style: '' color:read '' ...
- python网络应用篇
正则表达式 import re #引入正则表达式模块 使用re.match/search函数进行匹配(区别:match只匹配字符串的开始,如果不符合正则表达式,则匹配失败,返回None,而searc ...
- @Transient注解的使用(不被序列化和作为临时变量存储)
转自:https://blog.csdn.net/sinat_29581293/article/details/51810805 java 的transient关键字的作用是需要实现Serilizab ...
- 【转贴】Windows virtio 驱动
Windows virtio 驱动 https://blog.51cto.com/dangzhiqiang/1833615 去年去中建总部的时候用过. 发现很多搞openstack的人都不清楚这一块的 ...
- Java基础(十)
复习 静态方法与成员方法 //另一个类里的静态和成员方法 public class MyClass { //静态方法 public static void method2() { System.out ...
- hive自定义udaf函数
自定义udaf函数的代码框架 //首先继承一个类AbstractGenericUDAFResolver,然后实现里面的getevaluate方法 public GenericUDAFEvaluator ...
- C语言函数调用时候内存中栈的动态变化详细分析(彩图)
版权声明:本文为博主原创文章,未经博主允许不得转载.欢迎联系我qq2488890051 https://blog.csdn.net/kangkanglhb88008/article/details/8 ...