计算机NewLine的小知识

问题描述

今天Q群里,有个朋友问了我这么一个问题:“js可以判断一段文字,是否有回车吗?如果有回车的话,可以把回车过滤掉吗?”

这个问题本身并不难,用正则表达式就能很轻易的过滤掉。花了不到5分钟的时间,我快速出了一个DEMO,代码如下:

<!DOCTYPE html>
<html>
<head>

</head>
<body>

    <textarea id="t" rows="4" cols="50">
    At w3schools.com you will learn how to make a website.

    We offer free tutorials in all web development technologies.
    </textarea>

    <script>

        var dom = document.getElementById(‘t‘);
        var val = dom.value;
        var re = /\r|\n/g;
        var rip = val.replace(re,"");

        console.log(rip);

    </script>

</body>
</html>

有另外一个同学就问了:“回车是var re = /\r|\n/g;吗?回车不是单独的\n吗?”

我印象中,不同的系统之间,回车换行处理方式好像是不一致的,但是细节上我的确是没有搞清楚。挖掘机还是要找蓝翔的,那\n\r还是\r这个问题只能找谷歌了。

回车换行的历史

Long long ago,当时的计算机使用一种叫做Teletype Model 33 ASR作为终端。当时,这种Teletype有一个约定:使用CR + LF来表示换行。

LR(a.k.a Line Feed)意思就是要打字机切换到新的一行上接着打印,而CR(a.k.a Carriage Return)指示打字机将打印设备定位到一行的开头。

为什么需要两个控制字符来表示换行?

早期的打字设备有一个关于Carriage Return比较严重的问题,但这个问题我不大清楚是怎么一回事,维基百科是这么描述的:

Early teletype machines had a problem when a printing character followed the carriage return. It just printed it as a smudge, on-the-fly in the middle of the page, while it was moving the carriage back to the first position. "The solution was to make the newline two characters: CR to move the carriage to column one, and LF to move the paper up."

是的,为了解决上面的问题,所以使用了LF把纸往上移动一行,然后在用CR把打印设备定位到第一列。

这是硬件方面的问题,计算机为什么也用CR + LF表示换行?

在那个时候,设备驱动的概念还没有出现。换句话说,就是还没有一种技术可以隐藏这些底层硬件设备之间的区别,应用程序必须负责处理这些细节上的问题。当时应用程序的做法是直接采纳了Teletype的CR + LF换行这一约定。

这里还有一些其他的历史原因,早期的DEC微型计算机直接使用CR + LF换行这一约定。后来MS-DOC出于程序兼容方面的考虑,故而还是采纳了CR + LF换行这一约定,这一约定在Windows操作系统中也被保留了下来。

另外,当时的多任务操作系统只使用LF作为换行符。当时的多任务操作系统已经开始使用设备驱动来屏蔽底层硬件的区别了,所以上层应用程序编写起来就相对方便多了。大名鼎鼎的Unix操作系统保留了这一处理方式,而Unix后面的操作系统则效仿Unix的做法。

NOTE: DEC(Digital Equipment Corporation),既美国数字设备公司。1998年1月DEC公司被康柏以96亿美元的价格收购,2001年惠普康柏宣布合并。

其他答案

当我用中文搜索的时候,比如这篇博文,作者的解答是这样的:

在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33,Linux/Unix下的tty概念也来自于此)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。

于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。

后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。

然后很多的中文博客用的都是这么一个答案。我不知道电传打字机的研发过程是怎样的,对比维基百科的解释,我觉得这个答案严重,极其不靠谱

参考

  1. Newline
  2. Multics
  3. Typewriter
  4. Teletype Model 33
时间: 2024-10-11 10:43:03

计算机NewLine的小知识的相关文章

Linux 小知识翻译 - 「编译器和解释器」

这次聊聊「编译器和解释器」. 编程语言中,有以C为代表的编译型语言和以Perl为代表的解释型语言.不管是哪种,程序都是以人类能够理解的形式记录的,这种形式计算机是无法理解的. 因此,才会有编译器和解释器. 对于编译型语言,是使用编译器将人类可读的代码转换为机器能够理解的「机器语言」文件,然后通过执行这个「机器语言」文件来实现程序的执行. 另一方面,对于解释型语言,是使用解释器将人类可读的代码逐行解释,一边解释一边执行这个程序.(这里的解释是将代码解释成机器语言,让计算机能够理解) 甚至有的语言既

学习javascript总结下来的性能优化的小知识(二)

上面一篇文章大致介绍了一些javascript当中使用的一些小技巧,当下这篇文章继续介绍一下内存管理.松散耦合.性能方面的一些小知识.为避免错误应该注意的点 内存管理 1.循环引用 如果循环引用中包含DOM对象或者ActiveX对象,那么就会发生内存泄露.内存泄露的后果是在浏览器关闭前,即使是刷新页面,这部分内存不会被浏览器释放. 简单的循环引用: var el = document.getElementById('MyElement'); var func = function () { //

Linux 小知识翻译 - 「DNS服务器」

这次聊聊「DNS服务器」. DNS(Domain Name System)服务器,也被称为域名服务器. 因为使用互联网的时候,必须要指定DNS服务器,所以你一定听过DNS这个名字吧. 那么,这个DNS服务器是干啥用的呢? 通过互联网连接其他主机的时候,用户一般会输入类似「www.lpi.or.jp」这样的主机域名. 这种域名对用户来说很好理解.但是计算机是通过「202.218.212.222」这样的IP地址来识别网络的主机的. DNS服务器的任务就是建立这种域名和IP地址的对应关系. 粗略来说,

电脑系统维护小知识!——————【Badboy】

电脑系统维护小知识 1.经常进行"磁盘清理"和磁盘碎片整理" 当硬盘用久了,无数次的新增.更改和删除程序和文件后,就会造成很多断断续续的扇区,非连续性的文件便会愈来愈多,硬盘磁头便需要花更多时间跳来跳去来读取数据,这就导致硬盘速度减慢.因此,我们应该定期进行"磁盘清理"和磁盘碎片整理",将所有非连续性的文件重新编排整齐.处理方法:点开始-程序-附件-系统工具-磁盘清理程序和磁盘碎片整理程序.有可能整理过程很慢,那是你长时间没有清理或者有只读文件,

Linux 小知识翻译 - 「架构 续」(arch)

上次,从「计算机的内部构造」的角度解释了架构这个术语.这次,介绍下架构中经常提到的「i386架构」及之后的「i486」,「i586」. 安装Linux的时候,很多人即使不了解但也会经常听到i386架构这个词.因此,会误认为「自己的PC的架构是i386架构的」.现在用i386的人是非常少的. i386的 i 就是「Intel」的首字母.i386是1985年发布的架构,那么如今还在用i386电脑的人... ...将近20年没有换过电脑了.(这篇文章应该是作者2005年左右写的) 实际上i386的CP

大数据入门小知识

之前写过大数据入门小知识和大数据入门小知识进阶篇,今天为大家带来大数据入门小知识高阶篇. 推荐一个大数据学习群 119599574晚上20:10都有一节[免费的]大数据直播课程,专注大数据分析方法,大数据编程,大数据仓库,大数据案例,人工智能,数据挖掘都是纯干货分享,你愿意来学习吗? 大数据入门小知识高阶篇,主要讲述的是因为大数据而衍生出来的一系列技术与科技创新. 说到因为大数据而衍生出来的一系列技术与科技创新,相信我们首先都会想到人工智能(Artificial Intelligence),英文

iOS 小知识-tips

--->1<--- arc的项目中使用非arc代码,则添加-fno-objc-arc: 非arc项目中使用arc代码,则添加-fobjc-arc. --->2<--- 实用的类 NSKeyedArchiver [UIScreen mainScreen] [UIDevice currentDevice] [UIFont familyNames] [UIApplication sharedApplication] [NSUserDefaults standardUserDefaults

Linux 小知识翻译 - 「syslog」

这次聊聊「syslog」. 上次聊了「日志」(lgo).这次说起syslog,一看到log(日志)就明白是怎么回事了.syslog是获取系统日志的工具. 很多UINIX系的OS都采用了这个程序,它承担了「获取系统全部的日志」这个维持系统正常运行的重要任务. syslog的本体是「syslogd」这个daemon(一般翻译成守护进程),常驻内存中获取日志. syslog的特点是可以通过配置文件「/etc/syslog.conf」,对「哪种应用程序?哪种重要度的信息?记录在哪个文件中?」等进行细致的

Linux 小知识翻译 - 「日志」(log)

这次聊聊「日志」. 「日志」主要指系统或者软件留下的「记录」.出自表示「航海日志」的「logbook」. 经常听说「出现问题的时候,或者程序没有安装自己预期的来运行的时候,请看看日志!」. 确实,记录了系统和软件详细运行情况的「日志」是信息的宝库,通过日志来解决问题的事例也非常多. 但事实上,「无论如何也不会看日志」的用户也有很多.理由很简单,日志的信息量非常大,全部用眼睛来看的话是非常吃力的. 而且,英语写的日志也会让英文不好的人敬而远之. 虽说「要养成用眼睛来看日志的习惯」,但实行起来却非常