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的字符编码与解码问题(以点破面). 前言:字符串的编码 ...
随机推荐
- 安装xampp扩展你要注意这些
Windows下安装PHP扩展是一件很麻烦的事情,看一个xampp扩展的附件名一般都是这样的命名规则,如:xampp_http-5.3-nts-svn20091125-vc9-x86.zip 你要了解 ...
- 用泛型方法Java从实体中提取属性值,以及在泛型方法中的使用
public <T> T getFieldValue(Object target, String fieldName, Class<T> typeName) { try { O ...
- iOS类型的转换
1.NSData和NSString的转换: - (void)viewDidLoad { [super viewDidLoad]; // 字符串 NSString *str = "; NSLo ...
- JS-T
取整函数ceil:向上取整floor:向下取整round:四舍五入 js获取当前页面信息this.location.href JS打印对象 var data = JSON.stringify(res. ...
- acrobat xi pro 11 补丁激活
acrobat xi pro 11 是一款专门为Adobe Acrobat XI Pro 11制作的破解补丁,这款补丁可以免去软件的激活步骤,让用户可以永久免费使用这款软件.11是款功能强大的pdf设 ...
- flask_sqlalchemy基本设置
from flask import Flask from flask_sqlalchemy import SQLAlchemy #区别 sqlalchemy这是第三方模块不属于flask app = ...
- npm install 报 128 错误
[问题描述] 项目执行npm install的时候特别慢,到最后直接返回错误: verbose exit [ 1, true ] [解决方法] 执行以下两条命令: git config --globa ...
- zip 命令
NAME zip - package and compress (archive) files SYNOPSIS zip [-aABcdDeEfFghjklLmoqrRSTuvVwXy ...
- 脚本自动创建ldap账号
背景:客服那边人员流动性大,经常需要配置账号,每次创建账号配置权限比较繁琐. 配置脚本: ldapadduser.sh #!/bin/bash # add ldap user ] || [[ $ -n ...
- supervisor管理superset
参考: https://blog.51cto.com/qiangsh/2153185 安装supervisor: pip install supervisor 停止supervisor管理的服务: [ ...