python 视频转码,python中文编码转换

  python 视频转码,python中文编码转换

  首先,了解字符编码的知识储备

  1. 文本编辑器存取文件的原理(nodepad++,pycharm,word)

  当您打开编辑器时,您启动了一个进程。它在内存中,所以编辑器中写的内容也存储在内存中。断电后数据会丢失,需要保存到硬盘。单击保存按钮,将数据从内存刷到硬盘。此时我们写一个py文件(还没有执行过),和其他文件没什么区别,只是一堆字符而已。

  也就是当我们不点击保存的时候,我们写的所有东西都被写入内存。注意这个,很重要!当我们点击保存时,内容被刷到硬盘上。

  上面做了两件事:写内容到内存,从内存刷内存到硬盘。这是两个过程。

  2. python解释器执行py文件的原理 ,例如python test.py

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

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

  阶段3: python解释器解释并执行刚刚加载到内存中的test.py的代码。

  Python解释器分两步执行py文件:1 .将文件读入内存,请按2。解释执行内容。

  二。字符编码简介编码/解码本质上是一种映射(对应)。比如‘A’用ascii码编码的时候是65,电脑里存的是00110101。但是,当它显示时,不能显示00110101,而应该显示“A”。但是计算机怎么知道00110101是‘A’呢?这需要解码。当选择ascii时,需要对其进行解码。

  编码:实字符与二进制串的对应关系,实字符二进制串。

  解码:二进制串与实字符的对应关系,二进制串实字符。

  要理解字符编码,首先要解决的问题是:什么是字符编码?

  众所周知,计算机要工作必须上电,也就是‘电’驱动计算机工作,而‘电’的特点是高低电平(高低平是二进制数1,低电平是二进制数0),也就是计算机只认识数字(010101)。如果要保存数据,首先要对我们的数据做一些处理,最后转换成010101。

  所以它必须经历一个过程:

  字符--------(翻译过程)-------数字

  这个过程其实就是一个字符如何对应一个具体数字的标准,叫做字符编码。

  那么问题来了?作为编码方案,必须解决两个问题:

  A.字节是如何分组的,比如一组8位还是16位?这也称为编码单元。

  B.编码单位和字符之间的映射关系。例如,在ASCII码中,十进制65被映射到字母a。

  ASCII码是上个世纪最流行的编码系统之一,至少在西方是这样。下图显示了ASCII代码中的编码单元如何映射到字符。

  随着电脑越来越普及,厂商之间的竞争越来越激烈,不同电脑系统之间的数据转换变得非常痛苦。人们已经厌倦了这种定制带来的混乱。最后,计算机制造商制定了一个描述字符的标准方法。他们定义使用一个字节的低7位来表示字符,并制作了上图所示的对照表,将7位的值映射到一个字符。比如字母A是65,C是99,~是126等等。ASCII码就这样诞生了。最初的ASCII标准定义了从0到127的字符,可以用正好7位来表示。

  为什么选择7位而不是8位来表示一个字符?我不在乎。但是一个字节就是八位,也就是说有一位没有用,也就是说128到255的编码不是制定ASCII标准的人规定的。这些美国人对世界其他地方一无所知,甚至根本不在乎。其他国家的人们借此机会开始使用从128到255的代码来表达他们自己语言中的字符。比如144是阿拉伯语ASCII码,但是是俄语ASCII码。ASCII码的问题是,尽管每个人都同意使用字符0-127,但对字符128-255有很多很多不同的解释。你必须告诉计算机使用哪种类型的ASCII码才能正确显示字符128-255。

  总结:ASCII码,一个字节代表一个字符(英文字符/键盘上所有其他字符),1字节=8bit,可以代表0-2**8-1的变化,即可以代表256个字符。ASCII一开始只用了后7位和127位,已经可以完全代表键盘上的所有字符(英文字符/键盘上所有其他字符)。

  阶段二:为了满足中文,中国人定制了GBK

  GBK:2字节代表一个字符;为了满足其他国家,每个国家都定制了自己的代码。日本把日语编译成Shift_JIS,韩国把韩语编译成Euc-kr。

  阶段3:通用代码的Unicode编码

  后来有人开始觉得代码太多让世界太复杂,让人头疼,于是大家坐在一起拍着脑袋想出一个方法:所有语言的字符都用同一个字符集表示,就是Unicode。

  Unicode统一用2字节来表示一个字符,2**16-1=65535,可以表示6万多个字符,所以兼容所有语言。但是对于英文的整篇文本来说,这种编码方式无疑是双倍的存储空间(英文字母只需要一个字节,很浪费空间)。于是UTF-8就产生了,对于英文字符使用3个字节。汉字的UTF-8是一个非常神奇的概念。它漂亮地实现了ASCII码的向后兼容,以保证Unicode能被大众接受。

  在UTF-8中,字符0-127由1个字节表示,使用与US-ASCII相同的编码。这意味着80年代编写的文档可以毫无问题地在UTF 8中打开。只有128个及以上的字符由2、3或4个字节表示。因此,UTF-8被称为变长编码。所以下面的字节流如下:

  0100100001000101010011000100110001001111

  这个字节流在ASCII和UTF-8中表示相同的字符:HELLO。

  至于其他UTF-16,这里就不描述了。

  总结一下:unicode简单粗暴。所有字符都是2字节。优点是字符-数字转换速度快,缺点是占用空间大。

  Utf-8:准确,不同的字符用不同的长度表示。优点是节省空间,缺点是字符到数字的转换速度慢,因为每次都要计算一个字符需要多长的字节才能准确表示。

  因此,内存中使用的编码是unicode,用空间换时间(程序都需要加载到内存才能运行,因而内存应该是尽可能的保证快);

  所有的程序最终都要加载到内存中,并且程序在不同的国家以不同的编码格式保存到硬盘中。但是在内存中,我们为了兼容所有国家,统一固定使用unicode(这就是为什么计算机可以在任何国家运行程序),这也是为什么使用unicode进行内存固定的原因。你可能会说,我可以使用UTF-8兼容所有国家。可以,可以正常工作。之所以不能确定unicode比UTF-8更高效(uicode总是用2字节编码,而UTF-8需要计算),但是unicode浪费的空间更多。是的,这是一种用空间换时间的方式。但是在硬盘存储或者网络传输的时候,需要将unicode转换成UTF-8,因为数据传输稳定高效,数据量越小,数据传输越可靠,所以都是。

  不管是什么类型的文件,只要记住一件事:硬盘中或者网络传输用utf-8,网络I/O延迟或磁盘I/O延迟要远大与utf-8的转换延迟,而且I/O应该是尽可能地节省带宽,保证数据传输的稳定性。

  文件以什么编码保存的,就以什么编码方式打开.

  下面我们来看看python中关于编码出现的问题:如果在python文件中没有指定头信息#-*-编码:utf-8-*-使用缺省值。python2中默认使用ascii,python3中默认使用UTF-8。

  

  读取已经加载到内存的代码(unicode编码的二进制),然后执行,执行过程中可能会开辟新的内存空间,比如x="hello"内存采用unicode编码,并不意味着内存中所有的二进制代码都是unicode。在程序执行之前,内存中所有的二进制代码都是unicode。比如从文件中读取一行x=hello ,其中x、等号、引号、状态都是一样的,都只是普通字符。所有这些都以unicode编码的二进制形式存储在内存中。但是在程序执行过程中,会申请内存(与程序代码所在的内存是两个空间),可以存储任意编码格式的数据,比如x=hello ,会被python解释器识别为字符串,会申请内存空间存储 hello ,然后让x指向内存地址。此时,新应用程序的内存地址也是unicode编码的hello。如果代码改成x=hello 。encode(utf-8 ),那么utf-8编码的字符串Hello将存储在新应用程序的内存空间中。

  浏览网页时,服务器会将动态生成的Unicode内容转换成UTF-8,然后传输给浏览器。

  如果服务器编码的编码格式是utf-8,则客户机内存中也会接收到utf-8编码的二进制文件。

  Python3不仅把字符串的编码改成了unicode,还明确区分了str和bytes。str是unicode格式的字符,bytes是纯二进制的。

  在py3中,字符必须以unicode编码,所有其他编码都以字节格式显示。

  python3中还有两种字符串类型str和bytes。

  字符串类型变成了unicode类型

  #编码:utf-8s= forest #程序执行时不需要加U, forest 会以unicode的形式保存在一个新的内存空间中。#s可以直接编码成任何编码格式s . encode( UTF-8 )s . encode( GBK )print(type(s))# class

  #编码:utf-8s= forest #程序执行时,不需要添加U, forest 也会以unicode形式保存在新的内存空间中。#s可以直接编码成任何编码格式S1=s . encode( UTF-8 )S2=s . encode( GBK )print(s)# forest print X97 在python3中,print what is(S2)# b \ xc1 \ Xd ditto print(type(s))# class str print(type(S1))# class bytes print(type(S2))# class bytes python 3文件默认编码是UTF-8,字符串编码是unicode utf-8或GBK码。当加载到内存中时,它会自动变成unicode并正常显示。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: