Monday, August 31

关于回车符、换行符

 

打字机(这个组里用过原始机械打字机的人不多)上有两个机械装置,一个是回到句首,另一个是换行,真正使用时这两个机械装置是联合在一起的,成为回到句首并换行,就是 ENTER 键的作用。这就是我们所说的"回车".

 

回到句首在英文里是 Carriage Return, 就是让那个附带着纸的转盘回到原始位置,打字口对着行首

换行在英文里是"Line Feed",让纸往上走1行,打字口就对着下一行。有时也可以翻译成进纸

所以有时你能看到 CRLF,就是指这两个操作。



在电脑发明之后,国际标准设计了 ASCII表,比如 65来表示A66表示B;其中还用10(十六进制的 0x0A)来表示换行 Line Feed, 13(十六进制的 0x0D)来表示回到句首 Carriage Return。在Word, textpad上,只要发现文件里这字节是1013在一起,就从下一行开头显示下一个字节。

这样的不能直接显示,但是有意义的字符我们叫做控制字符

Unix/Linux/Mac里,设计人员偷懒,因为这两个字节总是连在一起的,那么就用其中一个就足以表示换行(并回到句首)了,所以他们只用 ASCII 10 Line Feed 来做这件事情。Linux是爽了,但是跟Windows交换文件时就经常出现混乱,所以还特地写了两个程序来替换回车符,一个叫做 dos2unix,另一个叫做 unix2dos (命名很没有创新感)。



总说“ASCII 13 Carriage Return ” “ASCII 10 Line Feed ” 很麻烦,写在程序上也乱,所以我们给了这两个字符别称,第一个叫做 '\r', 第二个叫做 '\n' 。在C语言里,单引号表征字符,比如 char c='\n';  大家一看就知道这是一个ascii 10 的控制字符,在显示时应该走到下一行;而如果用 string s="\n"; 这就是两个字符,分别是 ascii=92 '\' ascii=110'n' python语言里没有单引号和双引号的区别,所以它规定:如果 \ 后面带着有意义的字母,比如 \r, \n, \t, \f ,它就认为这是控制字符,就把 "\" 和后面的字母 (这两个字符)记录成一个控制字符的ascii码。 如果你要拒绝这个转义,在代码里你要写两个斜杠。例子:





>>> print("a\nb")

a

b

>>> print("a\\nb")

a\nb



能看到 "a\nb" 和 "axb"一样都是3个字节。

希望从这个例子里你能看出:我们必须分清楚,当我们说 "\n"的时候,是表示一个字节的控制字符?还是表示能够看得见得两个字符!