python基础之Day7part2 史上最清晰字符编码理解
二.字符编码
基础知识:
文本编辑器存取文件原理与py执行原理异同:
存/写:进入文本编辑器 写内容 保存后 内存数据刷到硬盘
取/读:进入文本编辑器 找到内容 从硬盘读到内存 notepad把文件内容打印到屏幕上(py启动解释器,把py当作普通文件读到内存,最后识别语法,执行)
你往文本编辑里写汉字,内存里存的是计算机能识别的二进制,按照当时写的标准(Unicode)再反解打印出来,计算机并不识别是哪国语言
字符编码:
将人类的字符转换成计算机能识别的数字,这种转换必须遵循固定的标准,人类的字符和数字的对应关系。
A-1 B-0 位数越多能表示的字符越多 当初美国人用8位( 2^8) 与英文字母对应
ASCII
1个英文字符等于8个二进制位bit 等于一个Bytes 可以表示2^8的英文字符
GBK
1个中文字符等于16个二进制位等于两个Bytes 可以表示2^16的中文字符
这个阶段不会出现乱码,因为各国都用自己的。
但是软件开始跨国使用后,硬盘上还是各国软件自己编码的二进制数字(暂时不考虑硬盘),内存里需要找到兼容万国的unicode,
与全世界的字符都建立好对应关系,用两个Bytes表示一个字符
如果直接用unicode从内存写到硬盘,对于英文来说就浪费空间了,所以需要更精简的格式UTF-8,将数据量控制到最精简,提高计算机运行效率
(UTF-8 是可变长的 每个语言都用适合自己的长度 更全面 用1个Bytes表示英文,3个Bytes表示中文)
但是为什么不能内存直接存成UTF-8 ,而是多此一举存成unicode?
unicode兼容万国 和各国语言你建立映射关系 老版本的都可以反解成unicode
UTF-8虽然兼容万国但与各国编码无对应关系 所以内存里不能放UTF-8
硬盘已经无法统一,各国软件已经在那里了,历史遗留问题,只要内存统一就行
目前达成共识,往硬盘里存UTF-8,很多很多年后,历史软件退役,硬盘里就不会有乱七八糟的各国标准了
重要结论1:
内存中固定使用unicode编码,唯一可以改变的是存储到硬盘时使用的编码
重要结论2:
要想保证存取文件不乱码,应保证文件当初以什么编码存,就以什么格式取
Unicode-编码成 gbk gbk-解码成unicode
重要结论3:
py3默认读取文件按照UTF-8
文件头:coding="gbk" 告诉py按照你指定的编码去读文件(指定的编码应该和存的编码(py右下角显示的是存的)一致)
因为一般默认以UTF-8存,也以它取,所以通常不需要再指定,但是如果去py2运行的话就要考虑了,所以最好都指定coding="utf-8"
print() 内存丢到操作系统 当初以UTF-8 内存unicode 现在操作系统以gbk
py2里面字符串前面加u'跨平台更好 制造unicode 不加'u的话 就是Unicode按文件头指定格式的,否则按默认的ASCII
py3 只能编码 因为默认的字符串类型是unicode编码 可以编码成bytes类型
把内存的字符串写到硬盘,把内存里的unicode编码成其他可以写进硬盘里的类型,例如bytes
python基础之Day7part2 史上最清晰字符编码理解的更多相关文章
- 深入理解JavaScript系列:史上最清晰的JavaScript的原型讲解
一说起JavaScript就要谈的几个问题,原型就是其中的一个.说了句大话,史上最清晰.本来是想按照大纲式的行文写一下,但写到后边感觉其实就一个概念,没有什么条理性,所以下面就简单按照概念解释的模式谈 ...
- python中文编码问题深入分析(一):字符编码基础
背景:笔者作为一名刚接触python语言的新手,在实际的项目中,遇到过一些中文编码问题,初次遇到这些问题的时候,刚开始显得有些手足无措,也不知从何查起.常言道:有问题,找度娘!当我打开www.baid ...
- python基础(5):格式化输出、基本运算符、编码问题
1. 格式化输出 现在有以下需求,让⽤户输入name, age, job,hobby 然后输出如下所⽰: ------------ info of Alex Li ----------- Name : ...
- python教程1:Python基础之数据类型和变量、字符串和编码
视频链接:http://www.bilibili.com/video/av10730372/ 我是在Linux下玩python的,Linux下默认安装python,直接打个pyhon3就好了,pyth ...
- Python基础系列----语法、数据类型、变量、编码
1.基本语法 Python ...
- python基础(格式化输出、基本运算符、编码)
1,格式化输出. 现有一练习需求,问用户的姓名.年龄.工作.爱好 ,然后打印成以下格式 ------------ info of Alex Li ----------- Name : Alex Li ...
- Python之路-python(set集合、文本操作、字符编码 )
一.集合操作(set) ...
- Python 基础【二】 上
一.python语言分类 1. C python c语言的python版本 官方推荐 使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行 ...
- python基础--14大内置模块(上)
python的内置模块(重点掌握以下模块) 什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类 ...
随机推荐
- sequelize查询数据的日期格式化
首先确定时区 const sequelize = new Sequelize(config.database, config.username, config.password, { host: co ...
- html动态元素点击事件添加
很多时候,页面的元素是后期异步动态添加在页面上.页面点击事件无效. 非动态的元素直接$().click();便可以直接触发点击事件,而动态元素需要事先注册事件. $(document).on('cli ...
- 学习笔记之scikit-learn
scikit-learn: machine learning in Python — scikit-learn 0.20.0 documentation https://scikit-learn.or ...
- cookie.js插件
/*! cookiejs v1.0.23 | MIT (c) 2018 kenny wong | https://github.com/jaywcjlove/cookie.js */!function ...
- [UE4]记录瞬移目标点
1.判定射线是否击中一个物体:LineTraceByChannel的Return Value返回值 2.击中的目标点:LineTraceByChannel.Out Hit.Location,如图提示文 ...
- MySQL 之 MHA + ProxySQL + keepalived 实现读写分离,高可用(二)
ProxySQL安装 yum/rpm安装 在github或官网上可以下载rpm包,wiki的Getting start章节有详细介绍. cat <<EOF | tee /etc/yum.r ...
- MySQL架构之 主从+ProxySQL实现读写分离
准备服务器: docker run -d --privileged -v `pwd`/mysql_data:/data -p 3001:3306 --name mysql5-master --host ...
- C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新)
历史版本C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持.微软将C#提交给标准组织ECMA,C# 5.0目前是ECMA ...
- 红外NEC协议
注意: 用示波器在接收头抓的电平看起来和NEC协议刚好相反, 那是因为:HS0038B 这个红外一体化接收头,当收到有载波的信号的时候,会输出一个低电平,空闲的时候会输出高电平. 具体情况,具体分析. ...
- 5-安装sqoop
1.解压,修改权限 sudo tar -zvxf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /opt/app/ sudo chown -R hadoo ...