七、编码、文件

一、编码

1.1:内存和硬盘

  • CPU: 从内存中读取程序的指令,然后解码并运行程序;
  • 硬盘: 永久保存数据;
  • 内存: 临时存储数据,任何程序运行都需事先加载到内存;
  • 应用软件: 调用操作系统提供的接口;间接地使用计算机硬件,加载到内存中;
  • 操作系统: 控制硬件,提供系统调用接口,加载到内存中;

1.2:文本编辑器存取文件的原理  

  例如(nodepad++,pycharm,word等),打开编辑器就可以启动一个进程,是在内存中的,所以在编辑器编写的内容也都是存放在内存中的,断电后数据就丢失了。因而需要保存在硬盘上,点击保存按钮或快捷键,就把内存中的数据保存到了硬盘上。在这一点上,我们编写的py文件(没有执行时),跟编写的其他文件没有什么区别,都只是编写一堆字符而已。

1.3:python解释器执行py文件的原理

例如python  、test.py:

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

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

  第三阶段:python解释器执行刚刚加载到内存中的test.py的代码(在该阶段,即执行时,才会识别python的语法,执行到字符串时,会开辟内存空间存放字符串);

python解释器与文本编辑器相同点:python解释器是解释执行文件内容的,因而python解释器具备读py文件的功能,这一点与文本编辑器一样;

python解释器与文本编辑器不同点:文本编辑器将文件内容读入内存后,是为了显示/编辑,而python解释器将文件内容读入内存后,是为了执行(识别python的语法);

1.3:编码解释

  计算机想要工作必须通电,高低电平(高电平即二进制数1,低电平即二进制数0),计算机只认识数字,让计算机读懂人类的字符就必须经过:字符---------(翻译过程)-------------数字,实际就是一个字符如何对应一个特定数字的标准,这个标准称之为字符编码。

  1.一个python文件中的内容是由一堆字符组成的(python文件未执行时)

  2.python中的数据类型字符串是由一串字符组成的(python文件执行时)

1.5:编码的发展史

阶段一:

  1. 现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII;
  2. ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符;
  3. ASCII最初只用了后七位,127个数字,已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符);
  4. 后来为了将拉丁文也编码进了ASCII表,将最高位也占用了;

阶段二:

  1. 为了满足中文,中国人定制了GBK;
  2. GBK:2Bytes代表一个字符,为了满足其他国家,各个国家纷纷定制了自己的编码,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里;

阶段三:

  1. 各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码;
  2. 于是产生了unicode, 统一用2Bytes代表一个字符, 2**16-1=65535,可代表6万多个字符,因而兼容万国语言;
  3. 但对于通篇都是英文的文本来说,这种编码方式无疑是多了一倍的存储空间(二进制最终都是以电或者磁的方式存储到存储介质中的);
  4. 于是产生了UTF-8,对英文字符只用1Bytes表示,对中文字符用3Bytes;

阶段四:

  1. unicode:简单粗暴,多有的字符都是2Bytes,优点是字符--数字的转换速度快;缺点是占用空间大。
  2. utf-8:精准,可变长,优点是节省空间;缺点是转换速度慢,因为每次转换都需要计算出需要多长Bytes才能够准确表示。
  3. 内存中使用的编码是unicode,用空间换时间(程序都需要加载到内存才能运行,因而内存应该是越快越好)
  4. 硬盘中或网络传输用utf-8,保证数据传输的稳定性。

1: 所有程序,最终都要加载到内存,程序保存到硬盘不同的国家用不同的编码格式,但是到内存中我们为了兼容万国(计算机可以运行任何国家的程序原因在于此),统一且固定使用unicode,
2: 这就是为何内存固定用unicode的原因,你可能会说兼容万国我可以用utf-8啊,可以,完全可以正常工作,之所以不用肯定是unicode比utf-8更高效啊(uicode固定用2个字节编码
3:utf-8则需要计算),但是unicode更浪费空间,没错,这就是用空间换时间的一种做法,而存放到硬盘,或者网络传输,都需要把unicode转成utf-8,
4: 因为数据的传输,追求的是稳定,高效,数据量越小数据传输就越靠谱,于是都转成utf-8格式的,而不是unicode。

1.6:字符编码转换

  • 文件从内存刷到硬盘的操作简称存文件
  • 文件从硬盘读到内存的操作简称读文件
  • 乱码:存文件时就已经乱码 或者 存文件时不乱码而读文件时乱码

ascii:数字,字母 特殊字符。      字节:8位表示一个字节。      字符:是你看到的内容的最小组成单位。        abc : a 一个字符。        中国:中 一个字符。          a : 0000 1011

unicode: 万国码    起初:       a : 0000 1011 0000 1011       中: 0000 1011 0000 1111    升级:       a : 0000 1011 0000 1011 0000 1011 0000 1011       中: 0000 1011 0000 1111 0000 1011 0000 1011

utf-8:最少用8位表示一个字符。         a: 0000 1011      欧洲: 0000 1011 0000 1011     亚洲中:0000 1011 0000 1011 0000 1011

gbk:国标         a: 0000 1011        中文:0000 1011 0000 1011 两个字节。
  • 不同编码之间的二进制是不能互相识别的。
  • 对于文件的存储,及传输不能是unicode的编码。
    python3x        int        bool        bytes:内部编码方式:(非unicode,utf-8,gbk.gb2312...)        str : 内部编码方式unicode        list        dict        tuple

bytes:内部编码方式:(非unicode,utf-8,gbk.gb2312...)str : 内部编码方式unicode

对于字母

str:

  • 表现形式:s1 = ‘alex‘
  • 内部编码:unicode

bytes:

  • 表现形式:s2 = b‘alex‘
  • 内部编码:非unicode

对于中文

str:

  • 表现形式:s1 = ‘中国‘
  • 内部编码:unicode

bytes:

  • 表现形式:b1 = b‘\xe4\xb8\xad\xe5\x9b\xbd‘
  • 内部编码:非unicode

例子:

unicode和utf-8之间的转换:

s1 = ‘alex‘
#将alex从unicode编码转换为utf-8
b1 = s1.encode(‘utf-8‘)
print(b1)
#输出结果:
b‘alex‘
s1 = ‘alex‘
b1 = b‘alex‘
print(s1.capitalize())
print(b1.capitalize())
#输出结果:
Alex
b‘Alex‘
s2 = ‘中国‘
b2 = s2.encode(‘utf-8‘)
print(b2)
#输出结果:
b‘\xe4\xb8\xad\xe5\x9b\xbd‘

unicode----->utf-8------>unicode

s1 = ‘alex‘
# str ---> bytes encode 编码
b1 = s1.encode(‘utf-8‘)
print(b1)
#bytes---> str  decode 解码
s2 = b1.decode(‘utf-8‘)
print(s2)
#输出结果:
b‘alex‘
alex

Unicode、gbk、utf-8之间的转换:

s1 = ‘alex‘
b2 = s1.encode(‘gbk‘)
s3 = b2.decode(‘gbk‘)
print(b2)
print(s3)
#输出结果:
b‘alex‘
alex
s1 = ‘alex‘
b1 = s1.encode(‘utf-8‘)
s2 = b1.decode(‘gbk‘)
print(s2)
#输出结果:
alex

utf-8、gbk之间的转换

s4 = ‘中国‘
b4 = s4.encode(‘utf-8‘) # utf-8 bytes
print(b4)
b6 = b4.decode(‘utf-8‘).encode(‘gbk‘)
print(b6)
#输出结果:
b‘\xe4\xb8\xad\xe5\x9b\xbd‘   #bytes类型的utf-8一个中文3个字节
b‘\xd6\xd0\xb9\xfa‘         #bytes类型的gbk一个中文2个字节

二、文件

原文地址:https://www.cnblogs.com/bingo1024/p/9064138.html

时间: 2024-08-14 12:06:10

七、编码、文件的相关文章

Linux 中的七种文件类型

LINUX中的七种文件类型d  目录文件.l  符号链接(指向另一个文件,类似于瘟下的快捷方式).s  套接字文件.b  块设备文件,二进制文件.c  字符设备文件.p  命名管道文件.-  普通文件,或更准确地说,不属于以上几种类型的文件

Native2asciiUtil 文本文件转UNICODE编码文件(支持UTF-8,Unicode,UTF-16BE,ANSI|ASCII,GBK)

package com.ctl.util; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * * @author Administrator * @Description \u5C06\u6587\u672C\u6587\u4EF6\u8F6C\

PKPJIB七牛文件上传管理

圭拉镗夯後 PKPJIB七牛文件上传管理

七牛文件批量上传之自定义NSOperation

前言: 前阵子遇到七牛文件批量上传的问题,尝试了几种方案,现分享一种目前采用的方案--自定义operation. 为什么要自己实现七牛文件的批量上传 在使用七牛云存储服务的过程中,想要在手机客户端进行图片.视频等文件的上传,只需要直接引入SDK,然后使用QiniuSDK即可.对于iOS端的上传特别简单,只需要使用pod引入SDK: pod "Qiniu", "~> 7.0" 然后 #import <QiniuSDK.h> ... NSString

java 打印流 递归复制子文件子文件夹 不同编码文件复制到同一文件中 序列化流反序列化流

package com.swift.jinjie; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.PrintStream; /*从键盘输入一个文件夹路径,利用打印流将该文件夹下的所有文件(包括子文件夹)复制到D盘下temp文件夹下.*/ public class PrintAllT

一、虚拟环境.二、路由配置主页与404.三、2.x路由分发.四、伪静态.五、request对象.六、FBV与CBV.七、文件上传.

一.虚拟环境 ''' 解决版本共存 1. 用pycharm选择File点击NewProject然后选择virtualenv创建一个纯净环境 2. 打开下载的目录将venv文件夹下的所有文件(纯净的环境)copy到需要指定长期使用的文件夹下 3. 再次创建项目时,将该环境(指定长期使用的文件夹下Scripts文件夹中的python.exe文件)添加到pycharm环境选择(System Interpreter)中 4. 为该环境添加需要处理的版本共存包 ''' 二.路由配置主页与404 ''' 路

[Xcode10 实际操作]七、文件与数据-(9)编码创建Plist文件(属性列表文件)

本文将演示如何通过编码的方式,创建属性列表文件. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 1 import UIKit 2 3 class ViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 // Do any additional setup after loading the view, typically from

Python基础day-5[字符编码,文件处理,函数]

字符编码: 为什么要有字符编码?字符编码是为了让计算机能识别我们人写的字符,因为计算机只认识高低电平,也就是二进制数"0","1". 字符编码其实就是在完成一件,字符====>数字的翻译过程. ASCII: 最早计算机是美国发明的,所以最早诞生的ASCII码也是基于英文考虑的.ASCII码:一个Bytes代表一个字符,1Bytes=bit.最早的ASCII只用到后七位. 127个数字,已经完全能代表键盘了,后来又把127号之后的空位来表示新的字母.符号,还加入

Linux下查看文件编码,文件编码格式转换和文件名编码转换

linux相关   2008-10-07 10:46   阅读1392   评论0   字号: 大大  中中  小小  如果你需要在Linux中 操作windows下的文件,那么你可能会经常遇到文件编码转换的问题.Windows中默认的文件格式是GBK(gb2312),而Linux一般都是 UTF-8.下面介绍一下,在Linux中如何查看文件的编码及如何进行对文件进行编码转换. 查看文件编码 在Linux中查看文件编码可以通过以下几种方式: 1.在Vim中可以直接查看文件编码 :set file

Python学习笔记七:文件操作

文件操作 对照一个word文件的操作方式,来体会文件操作的内容 打开文件:f=open("file"),提示编码错误,windows默认是GBK f=open("file",encoding="utf-8) 输出全部内容:print(f.read()) 文件打开模式:默认为"r",只读:"w",写,创建新文件写,原文件内容被覆盖: "a",append,附加在文件最后 读.写只能有一种操作 关闭文