解析器解析全过程

首先,我们先让大家看一下python解析器的全流程:

我们编辑器编写好源代码->保存成文件。如果源代码中有编码声明而且用的编辑器支持该语法,那么该文件就以相应的编码方式保存在磁盘中。

注意:编码声明和源文件的编码不一定是一致的,你完全可以在编码声明中声明编码为utf-8,但是用GB2312来保存源文件。当然,我们不可能自寻烦恼,故意写错,而且,好的IDE也能强制保证两者的一致性,但是,如果我们用记事本或者editplus等编辑器来编写代码的话,一不小心就会出现这种问题的。

得到一个.py文件后,我们就可以运行它了,这时,我们就把代码交给python解析器来完成解析工作。

解析器读入文件时,先解析文件中的编码声明,我们假设文件的编码声明为GB2312,那么解析器会先将文件中的内容由GB2312转换成Unicode,然后再把这些Unicode转换成utf-8格式的字符串。

注意:这里仅指源代码即脚本代码的纯代码转换,完成这一步骤后,解析器把这些utf-8字符串分段,解析。如果遇到使用unicode字符串(如,u‘中国a我爱你’)那么就使用相应的utf-8字符串创建unicode字符串。

如果程序中使用的是一般的字符串,那么,解析器先将utf-8字符串通过unicode转换成相应的编码(这里也就是gb2312)的字符串,并用其创建一半的字符串对象,也就是说,unicode字符串根一般字符串在内存中的存放格式是不一样的,前者是用utf-8的格式,后者是用gb2312的格式。(注:普通的,非unicode的,即ascii)

好了,内存中的字符串格式我们知道了,下面我们要了解print的工作方式,print其实是负责把内存中相应的字符串交给操作系统,让操作系统相应的程序,比如cmd窗口进行展示,这里有两种情况:

1、若字符串是一般的字符串,那么print只需要把内存中相应的字符串推送给操作系统。

2、如果字符串是unicode字符串,那么print在推送之前先进行相应的encode,我们可以显示使用unicode的encode方式使用合适的编码来编码。

【链接】浅析Python解析器解析全过程:http://www.th7.cn/Program/Python/201508/548091.shtml

时间: 2024-10-21 23:28:08

解析器解析全过程的相关文章

rest-Assured-解析json错误-需使用预定义的解析器解析

报错信息: java.lang.IllegalStateException: Expected response body to be verified as JSON, HTML or XML but content-type 'text/plain' is not supported out of the box.Try registering a custom parser using: RestAssured.registerParser("text/plain", <p

使用java自带的xml解析器解析xml

使用java自带的xml解析器解析xml,其实我不推荐,可以用Dom解析,或其他的方式,因为Java自带的解析器使用不但麻烦,且还有bug出现. 它要求,针对不同的xml(结构不同),必须写对应的handler处理类,而Dom解析可以写通用的方法(前提是要写出通用逻辑)来处理,开发比较快.下面上代码 1 //------------------ main point --------------------- 2 javax.xml.parsers.SAXParserFactory 3 publ

Android开发系列(八):采用Pull解析器解析和生成XML内容

因为有些时候,应用的数据是采用XML文件的格式存放的,所以我们需要知道怎么从XML文件中读取这些数据 在Android中可以通过SAX.DOM.pull解析XML文件. 在本篇博文中主要介绍采用Pull解析器解析和生成XML内容. 介绍:在Android已经集成了Pull解析器,所以无需添加任何的jar文件.在Android中本身用到的各种xml文件,其内部也是采用Pull解析器进行解析的. 一.采用Pull解析器解析XML文件内容 首先,我们需要先建立一个Android Project项目,名

使用DOM解析器解析XML文件 学习笔记

dom解析和dom4j原理一致 Node是所有元素的父接口 常用的API: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();取得DOM解析器工厂 DocumentBuilder domParser = factory.newDocumentBuilder();取得DOM解析器 domParser.parse(*.xml)加载需要解析的XML文件 Document.getDocumentElement()取

安卓使用pull解析器解析XML文件

学习一下: 1 public class MainActivity extends Activity { 2 3 List<City> cityList; 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_main); 8 } 9 10 public void cli

利用 druid 解析器解析SQL

最近参与一个开源项目,一个功能的实现,用到了 druid 解析器来解析SQL,记录下如果使用 druid 来解析SQL,实现对SQL的拦截改写. 1. 对 insert 语句进行解析: private static String convertInsertSQL(String sql){ try{ MySqlStatementParser parser = new MySqlStatementParser(sql); SQLStatement statement = parser.parseSt

Android中Pull解析器解析xml文件案例

首先 准备一个供解析的xml文件,这里我们假定要解析的文件名称为person.xml,文件的具体内容为: <?xml version="1.0" encoding="utf-8"?> <persons> <person id="23"> <name>liming</name> <age>23</age> </person> </persons&g

Android Pull解析器解析XML文件和生成XML

PULL解析器方法如下: [注释] 读取到xml的声明返回 START_DOCUMENT: 结束返回 END_DOCUMENT : 开始标签返回 START_TAG: 结束标签返回 END_TAG: 文本返回 TEXT. 生成XML代码如下:

DOM解析器解析增删改学习笔记

import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.T