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中万恶的字符编码的更多相关文章

  1. Python : 熟悉又陌生的字符编码(转自Python 开发者)

    Python : 熟悉又陌生的字符编码 字符编码是计算机编程中不可回避的问题,不管你用 Python2 还是 Python3,亦或是 C++, Java 等,我都觉得非常有必要厘清计算机中的字符编码概 ...

  2. python全栈开发-Day7 字符编码总结

    python全栈开发-Day7 字符编码总结 一.字符编码总结 1.什么是字符编码 人类的字符--------->翻译--------->数字 翻译的过程遵循的标准即字符编码(就是一个字符 ...

  3. Python编程笔记二进制、字符编码、数据类型

    Python编程笔记二进制.字符编码.数据类型 一.二进制 bin() 在python中可以用bin()内置函数获取一个十进制的数的二进制 计算机容量单位 8bit = 1 bytes 字节,最小的存 ...

  4. Java web应用中的常见字符编码问题的解决方法

    以下是 Java Web应用的常见编码问题 1. html页面的编码 在web应用中,通常浏览器会根据http header: Content-type的值来决定用什么encoding, 比如遇到Co ...

  5. [转载]Java web应用中的常见字符编码问题的解决方法

    以下是 Java web应用的常见编码问题 1. html页面的编码 在web应用中,通常浏览器会根据http header: Content-type的值来决定用什么encoding, 比如遇到Co ...

  6. Python中文文件处理中涉及的字符编码及字符集

    在现在的互联网,字符编码是互联网信息交互的一个重要基础,各种语言都有支持信息编码的机制,Python也不例外.Python除了字符编码之外,对于字节码和字符串两种类型有严格区分,字符串是本地可以读取的 ...

  7. python学习第四天 --字符编码 与格式化及其字符串切片

    字符编码 与格式化 第三天已经知道了字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采 ...

  8. python基础(三)----字符编码以及文件处理

      字符编码与文件处理 一.字符编码 由字符翻译成二进制数字的过程   字符--------(翻译过程)------->数字   这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之 ...

  9. Python2/3的中、英文字符编码与解码输出: UnicodeDecodeError: 'ascii' codec can't decode/encode

    摘要:Python中文虐我千百遍,我待Python如初恋.本文主要介绍在Python2/3交互模式下,通过对中文.英文的处理输出,理解Python的字符编码与解码问题(以点破面). 前言:字符串的编码 ...

随机推荐

  1. docker批量删除容器、镜像(转载)

    1.删除所有容器 docker rm `docker ps -a -q` 2.删除所有镜像 docker rmi `docker images -q` 3.按条件删除镜像 没有打标签 docker r ...

  2. 2、puppet资源详解

    定义puppet资源 puppet资源抽象 资源定义 每一个资源有一个type.一个title和一个属性集合(attribute) type {'title':   //type表示资源类型,  ti ...

  3. libvirt报错总结

    libvirt 的一些报错总结 出现Permission denied error: internal error process exited while connecting to monitor ...

  4. 模拟SQLserver IO压力测试 工具编 SQLIOSIM

    描述 最近有业务需求需了解客户的服务器SQLserver 的IO情况,而不仅仅是通过系统计数器 了解硬盘的IO情况或者使用CrystalDiskMark或者Trace重播进行压力测试 .这时SQL S ...

  5. 002. Add Two Numbers

    题目链接:https://leetcode.com/problems/add-two-numbers/description/ Example: Input: (2 -> 4 -> 3) ...

  6. 掌握Pod-Pod调度策略

    一 Pod生命周期管理 1.1 Pod生命周期 Pod在整个生命周期过程中被系统定义了如下各种状态. 状态值 描述 Pending API Server已经创建该Pod,且Pod内还有一个或多个容器的 ...

  7. Linux 如何上传/下载文件

    注: 如果在操作中,提示没有权限请使用" su - "命令来切换当前账号至" root " 账号 一 .    使用 rz / sz 命令 1 .  登陆 Li ...

  8. go使用go-redis操作redis 连接类型,pipline, 发布订阅

    内容: 一 . 客户端Client(普通模式,主从模式,哨兵模式)二. conn连接(连接, pipline, 发布订阅等)三. 示例程序(连接, pipline, 发布订阅等)客户端Client 普 ...

  9. RabbitMQ和Kafka对比

    # 前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措.对于RabbitMQ和Kafka,到底应该选哪个? # R ...

  10. Oracle网络相关概念与常用配置文件

    监听器(Listener) 监听器是Oracle基于服务端的一种网络服务,主要用于监听客户端向数据库服务器提出的链接请求. 本地服务名(Tnsname) Oracle客户端与服务器端的链接是通过客户端 ...