0

0

详解Python中的字符编码

零下一度

零下一度

发布时间:2017-06-16 10:49:55

|

1387人浏览过

|

来源于php中文网

原创

下面小编就为大家带来一篇老生常谈python基础之字符编码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

前言

字符编码非常容易出问题,我们要牢记几句话:

1.用什么编码保存的,就要用什么编码打开

2.程序的执行,是先将文件读入内存中

立即学习Python免费学习笔记(深入)”;

3.unicode是父编码,只能encode解码成其他编码格式

utf-8,GBK这些是子8编码,只能decode编码成Unicode

一、什么是字符编码

我们知道,计算机只能识别二进制,我们平时写的代码都需要转成二进制才能被计算机识别。所以,我们写的字符怎么转换成二进制呢,这个过程实际就是通过一个标准使我们写的字符与特定数字一一对应,这个标准就称为字符编码。

字符------(字符编码)------->数字

二、字符编码发展历程

1.ASCII码

计算机起源于美国,字符编码也起源于美国。但是美国人民使用的文字只有26个字母,再加上些特殊符号就搞定了。不像我们中国,小学生就要认识几千个汉字。所以美国人民就使用了ASCII码(美国信息交换标准码)作为字符编码,一个Bytes代表一个字符,1Bytes=8bit,可以有2的8次方即256中不同的变化,但最初只用了前7位,即127个字符,已经足够美国人民使用了(当然也出于成本的考虑)。后来将拉丁文编入第8位,至此,ASCII码就被占满了,英语国家和拉丁国家可以愉快的玩耍了。

2.GBK

别看咱们中国暂时科技比不上美帝国,但是咱们有一颗积极向上的心啊,于是,在1980年,国家标准总局发布了中文使用的字符编码-->GBK,使用两个字节表示一个汉字,这样就有2的16次方即65536种组合,已经足够汉字使用了。

同时,其他国家也分别发布了自己国家的字符编码标准,如日本的shift_JIS,韩国的Euc-kr等等

3.Unicode

据说,字符编码鼎盛时期有数百种,且彼此间互相不支持,看来各国人民都很有骨气,但是这太不利于世界的互通了,于是Unicode应运而生。1994年,国际标准化组织发布了号称万国码的Unicode,用两个字节表示一个字符,有65536种组合,已经能把全世界绝大多数语言包括了。

4.utf-8

Unicode虽然好,但有一个问题,本来用一个字节就能表示的英文,现在要用两个字节,存储空间平白多出一倍,这显然是不完美的,所以又产生了utf-8,对英文字符只用1个字节,对中文字符用3个字节来表示。 

5.Unicode所有字符都是两个字节,简单粗暴,字符转换成数字的速度快,但是占用存储空间大

utf-8对不同的字符采用不用的长度表示,节省空间,但是转换效率不如Unicode快

内存中使用的字符编码是Unicode,内存就是为了加快速度的,所以宁肯牺牲一点空间,也要保证速度

硬盘和网络传输是用utf-8的,因为磁盘I/O或者网络I/O延迟要远大于utf-8的转换效率,并且在网络传输中应该尽可能节省带宽

三、Python解释器执行

第一阶段:python解释器启动,此时就相当于启动了一个文本编辑器

MD5校验和计算小程序(C)
MD5校验和计算小程序(C)

C编写,实现字符串摘要、文件摘要两个功能。里面主要包含3个文件: Md5.cpp、Md5.h、Main.cpp。其中Md5.cpp是算法的代码,里的代码大多是从 rfc-1321 里copy过来的;Main.cpp是主程序。

下载

第二阶段:python解释器作为文本编辑器,去打开t.py文件,从硬盘上将t.py的文件内容读入到内存中

第三阶段:python解释器解释执行刚刚加载到内存中t.py的代码

其中第二阶段,t.py文件在保存时有一个字符编码,在Python解释器打开文件时也要指定一样的编码方式(Python2默认的编码方式是ASCII,Python3默认是utf-8),如果文件保存的编码格式和Python解释器默认的编码方式不一样,就要在文件的开头写上#coding: ,来告诉python解释器不要用自己默认的编码方式来读,而是要用头文件指定的方式来读文件,这样才不会出错。

第三阶段:读取已经加载到内存中的代码(默认是Unicode),然后执行,执行过程中如果碰到类似定义变量的操作,就会在内存中开辟一块新的内存空间。此时注意,新开辟的内存空间不一定也是Unicode,用户可以在定义变量的时候指定编码方式,定义时开辟的内存空间,也只是一块空间而已,可以存放任意编码格式的代码。以Python3为例

四、编码解码

保存文件是把内存中的文件保存到硬盘上

读文件是把硬盘中的文件读到内存

Unicode是父编码,utf-8,GBK这些是子编码,如果子码想转换成其他编码,必须要先转换成父编码,再由父编码转换成其他子编码

解码就是decode,是由子码转成父码Unicode的过程

编码就是encode,是由Unicode转换成其他编码的过程

之前说过,文件读入内存中,就成了Unicode编码(当然这是默认情况,也可以根据指令更改),从硬盘读文件的过程就是把硬盘中的utf-8解码成Unicode

文件保存时,就是由内存保存到硬盘的过程,硬盘中是utf-8的编码方式,需要由Unicode编码成utf-8

五、Python2和Python3的区别

1.Python2的默认编码方式是ASCII,打开utf-8保存的文件时会报错,应该在头文件上加#coding : utf-8

Python2中的str被识别为Bytes,所以Python2中的str是被编码后的结果,其实会默认做一件事,就是在str前面加一个u,先转换成Unicode,在encode成bytes

Python2中有两种字符串类型,str和Unicode,str可以通过在前面加个‘u'来转换成Unicode

2.python 3 的默认编码方式是utf-8,可以直接打开用utf-8保存的文件

Python3中的str被识别成Unicode

Python3中也有两种字符串类型(bytes和str),但bytes就是bytes,str是unicode

六、打印到终端

首先要知道,Windows的终端的默认编码方式是GBK

终端也是应用程序,是运行在内存中的,所以我们用print()打印的过程,是从内存中到内存中。所以对于unicode,怎么打印都不会出错,但是Python2中除了加‘u'的字符串外,其他的字符串是Bytes,此时终端中是GBK编码,而Python2中是指定的utf-8或者默认的ascii码时,在终端中打印就会出错。

这些是我目前的理解,如果我以后意识到错误或者有表述不清的地方,再来修改。唉,字符编码是个坑啊

相关文章

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
php多线程怎么实现
php多线程怎么实现

PHP本身不支持原生多线程,但可通过扩展如pthreads、Swoole或结合多进程、协程等方式实现并发处理。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php如何运行环境
php如何运行环境

本合集详细介绍PHP运行环境的搭建与配置方法,涵盖Windows、Linux及Mac系统下的安装步骤、常见问题及解决方案。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php环境变量如何设置
php环境变量如何设置

本合集详细讲解PHP环境变量的设置方法,涵盖Windows、Linux及常见服务器环境配置技巧,助你快速掌握环境变量的正确配置。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php图片如何上传
php图片如何上传

本合集涵盖PHP图片上传的核心方法、安全处理及常见问题解决方案,适合初学者与进阶开发者。阅读专题下面的文章了解更多详细内容。

2

2026.01.31

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

1

2026.01.31

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

37

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

18

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

20

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

6

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号