小编换行字符回顾上次内容struct包可以让我们利用封包格式把数字封包到字节里pack函数卖力封包unpack函数卖力解封我们通过封到不同的字节状态遍历了一次ascii码

还是有那片玄色的区域彷佛是一片阴郁森林!
那里面到底有些什么秘密?我们这次向阴郁森林区域进发!

整理行装出发!
chr先看看"oeasy"这个字符串是如何存在的

字符都对应着一个数字数字在打算机上究竟是如何存储的呢?用二进制形式存储在字节中的可以看看这个二进制形式么?chr8bit 构成 byte

jspascll换行符号oeasypython0020换行字符feedlinelf反斜杠nB说话安徒生 RESTful API

上图的字节为(0011 0101)2(35)16对应着字符'5'

那字母呢?abcd在内存里长什么样子?文件编码编写一个文件写下 abcd用 :%!xxd:%!xxd -r 变回来

可以看到文件是用 2进制 办法存储的0x61 - a0x62 - b0x63 - c0x64 - d不论是内存、硬盘还是网络传输a 对应(0x61)16(0b01100001)2图中末了的那个 0x0a 对应什么字符???善用函数利用chr得到干系字符

0x0a对应的是'\n'这个字符这个字符彷佛在哪里见过?回到最初想要理解这个'\n'我们还得回到最初我们回到开始的时候

前面先容过BWK写的 c 措辞的第一个程序\n把稳到hello world后面的\n了么?把稳到hello world后面的\n了么?特殊把稳斜杠的方向这个方向\叫反斜杠键盘位置在回车键附近

那\n到底是什么??输出"\n"\n 是一个整体占一个字节算一个字符序号是(10)10进制也便是(0x0a)16进制这便是在开篇时的abcd后面的字符\n在内存里显示为一个.

我们直接把他输出看看输出输出

#输出\nprint("\n")#直接printprint()#查看序号ord("\n")#查看十六进制的序号hex(ord("\n"))输出结果

彷佛换了 2 行如果没\n的话,只换 1 行如果有\n的话, 就换 2 行我们看看ascii码表是如何定义的这第10个字符的找到位置我们已经身在在阴郁森林中找到了一个落脚点

十进制的10 便是 十六进制的 0x0A这个数值在 ascii 码表中意思是 LF啥意思?搜索搜索\n得到的结果是这样的LF 意味着 Line Feed喂行喂一行纸

那我真的可以用这个\n在字符中间换行嘛?考试测验换行

#输出字符串中带有\nprint("Hello\nWorld")在游乐场中考试测验

中途换行成功!
可以多来几个换行符吗?多来几个就往里面加\n

#输出字符串中带有\nprint("He\nllo\nWor\nld")显然这个 \n 便是一个换行字符串里面有个 \n 就意味着须要换 1 行他的英文是 Line Feed意思便是 新换1行这个东西实在比 ascii 的历史还要悠久从打字机的时期就有了

为什么要有换行符呢?换行符最最开始的时候分段落都是靠打字机输出空格完成换行自从有了这个LineFeed一个键就直接换行了以是LineFeed 极大地提高了效率

两个换行符就换两行可以利用chr函数么?利用序号得到换行符

#输出ascii值为10的字符chr(10)#把这个字符放在print里面输出print("hello"+chr(10)+"world")

纯文本中也会有回车符么?我们去看看纯文本文件打开文本文档

https://github.com/overmind1980/oeasy-python-tutorial.gitvi oeasy-python-tutorial/samples/000016/anderson_fairy_tales.txt首先下载这个仓库然后找到个中的安德森仙话这个本书

我们创造这个东西是318K那他有多少字符呢?字符数量1个英笔墨符占一个字节318k大概有318000个字节大概是31.8万个字符

这便是文本文件的形式第一行的Andersen后面有该当有两个换行符是不是呢真有换行符呢?字节形式所有行转化为字节形式%!xxd查找0a/0a

确实能够找到那两个换行符(0a)这可以和纯文本办法对应起来吗?纯文本办法文本中的换行实在便是换行符的效果在文本不雅观看模式下是换行

在字节不雅观看模式下是0a

这本书后来被翻译成安徒生童话安徒生童话里面有很多耳熟能详的故事《天子的新装》《海的女儿》《丑小鸭》《红舞鞋》《卖火柴的小女孩》《拇指姑娘》

在安徒生所处的时期(1805-1875)丹麦仍是一个君主专制主义社会20年代经济衰退童话用儿童视角透视繁芜生活万物有灵风趣诙谐Jean Hersholt将160个故事从丹麦文翻译成英文刘半农 1914年翻译了《天子的新衣》开始叶君健 1944年到1949年翻译了 安徒生童话全集互联网时期英文版安徒生童话被谷腾堡项目所收录落实文档当中便是用0和1来表示字符的如下图所示笔墨是蓝色的字节是玄色的

为什么\n会用来表示换行(Line-Feed)呢?追溯历史c措辞 中的 \n 来自于什么呢?来自于 B措辞B措辞 是里奇和汤普逊最早开拓 unix 的措辞B措辞 1969 年 就 运行在bell实验室 的 PDP-8 上1971 年里奇和汤普逊开始对付 B措辞 进行改造在新买的 PDP-11 上用 B措辞 给 B措辞 写扩展,称之为 NewB1973 年 NewB 基本主体完成改名叫 c措辞以是 c 实在是 NewB他们用手头的编译器和c措辞给 PDP-11 重写了一个 Unix Kernel机器措辞和汇编措辞本来不具有移植性就像x86的二进制程序不能直接运行在arm上须要移植c措辞 程序却可以在 很多架构 的处理器上编译运行只要那种架构的处理用具有对应的 c措辞编译器和库那就能顺利编译成针对该处理器架构的二进制程序乃至能实现跨平台编译也便是本日所说的交叉编译这便是 c措辞 在当时能够发展的缘故原由

c措辞 源自 B措辞B措辞 也不是凭空创造的源自什么呢?Basic Combined Programming Language(BCPL)B措辞 源自BCPL(Basic Combined Programming Language)1967 年由剑桥大学的 Matin Richards 制作

在同样由剑桥大学开拓的 CPL措辞 上改进而来BCPL 最早被用做牛津大学的 OS6操作系统 上面的开拓工具

后来通过美国贝尔实验室的改进和推广成为了 UNIX 上的常用开拓措辞最早 BCPL 措辞的样子就有个类似于l(ine)f(eed)的符号这是关于换行符表示法 最早的记录当时的换行符长什么样呢?BCPL的换行符当时的换行符长成这样!n

上述程序的目是输出 hello,world然后再来个回车以是hello world并不是c措辞的发明而是从c措辞的爷爷bcpl那时候就有了并且从bcpl时期就已经作为迷因(meme)开始传播python虚拟机的可实行文件也便是pyc文件是如何理解换行符的呢?反汇编(disassemble)不雅观察一下

\n涌如今字符串常量中能在pyc中找到这个常量么?先编译将py文件编译成pyc文件

再不雅观察pyc文件打开pyc文件

确实能够找到a和s之间的\n也便是(0a)16进制任务完成!


总结\n 便是换行符号换行符对应着 ascii 字符的代码是(10)10进制换行符的英文是 LF意思是Line Feed我们可以在《安徒生童话》的文本中找到每个字符对应的字节形态

不只txt文件是文件我们的python游乐场实质上也是一个二进制可实行的文件这个文件在哪?我们可以读懂这个可实行文件吗?我们下次再说!
蓝桥->https://www.lanqiao.cn/teacher/3584github->https://github.com/overmind1980/oeasy-python-tutorialgitee->https://gitee.com/overmind1980/oeasypython视频->https://www.bilibili.com/video/BV1CU4y1Z7gQ 作者:oeasy