CR LF \r \n 回车 换行   Leave a comment

在文本处理中, CR, LF, CR/LF是不同操作系统上使用的换行符.
Dos和windows采用回车+换行CR/LF表示下一行,
而UNIX/Linux采用换行符LF表示下一行,
苹果机(MAC OS系统)则采用回车符CR表示下一行.
CR用符号'\r'表示, 十进制ASCII代码是13, 十六进制代码为0x0D;
LF使用'\n'符号表示, ASCII代码是10, 十六制为0x0A.
所以Windows平台上换行在文本文件中是使用 0d 0a 两个字节表示, 而UNIX和苹果平台上换行则是使用0a或0d一个字节表示.
一般操作系统上的运行库会自动决定文本文件的换行格式. 如一个程序在windows上运行就生成CR/LF换行格式的文本文件,而在Linux上运行就生成LF格式换行的文本文件.
在一个平台上使用另一种换行符的文件文件可能会带来意想不到的问题, 特别是在编辑程序代码时. 有时候代码在编辑器中显示正常, 但在编辑时却会因为换行符问题而出错.
很多文本/代码编辑器带有换行符转换功能, 使用这个功能可以将文本文件中的换行符在不同格式单互换.
在不同平台间使用FTP软件传送文件时, 在ascii文本模式传输模式下, 一些FTP客户端程序会自动对换行格式进行转换. 经过这种传输的文件字节数可能会发生变化. 如果你不想ftp修改原文件, 可以使用bin模式(二进制模式)传输文本.

\n  行的结束  LF ( Line-Feed )
 \r  回车    CR ( Carriage Return )

 Unix \ Linux 使用 \n (LF) 表示换行
 Mac使用 \r (CR) 表示换行
 Windows 使用 \r\n (CR-LF) 表示换行


以前也看到EditPlus里面文本文件可以设置PC/UNiX /MAC三种格式,UltraEdit中可以设置DOS格式和Unix格式,一直不知道区别在那里。原来回车(CR)和换行(LF)符都是用来表 示"下一行"的。于是产生了三种不同的用法:Dos和windows采用回车+换行(CR+LF)表示下一行(亦即 所谓的PC格式,谁让MS最早雄踞PC市场呢,^_^),UNIX采用换行符(LF)表示下一行,MAC机采用回车符(CR)表示下一行。
 
涉及在PC和Unix两个平台下工作的人, 或注意过UltraEdit中三种文本文件格式的人, 或知道vim中:set fileformat选项的人, 应该知道在当今的电脑世界中, 存在三种文本格式:
 
PC: 或者说DOS的, 或者说微软的, 或者说WINDOWS的, 以<CR><LF>为行尾的标志.  其中<CR>的ASCII是十进制数的13, 十六进制的0x0D. <LF>的ASCII是十进制10, 十六制为0x0A.
 
Mac: 以<CR>作为文本文件行尾的标志符
 
UNIX: 以<LF>作为文本文件行尾标志符
 
在很多计算机语言中, <CR>表示为字符或字符串是\r, 而<LF>表示为字符或字符中是\n
 
而在printf这样的函数中, 如果你出现一个\n, 它却代表了一个逻辑上的意义, 即它代表在本地系统上的那种回车换行,  所以它在UNIX上只是<LF>, 但如果你在DOS上用诸如Truboc编程的话它输出的是<CR><LF>
 
Unix上有一个小工具, 专门在两种文件格式之间进行转换, 叫unix2dos, dos2unix.
 
在UltraEdit的 File->Conversions菜单中, 有三个子菜单项就是专供你在各种文本格式之间转换的.
 
在vim中, 如果你想把一个文件存为另一种文件格式, 只需:set fileformat=unix或等号后面是dos, mac即可, 接下来的存盘动作就会自动把你的文件存为指定平台的格式
 
怎么查看一个既有文件的格式:
 
unix上: file filename
 
注意第一个file是一个命令, 它会报告给定的文件的类型. 实际上它维护了一个各种文件类型特征的一个数据库, 可以告诉你任何文件的类型(当然前提是得先编进入数据库), 不光是文本文件格式这种小儿科
 
windows上:
 
我实在想不出来太好的办法, 你可以用记事本打开, 如果正常就是一个DOS格式的, 如果出现一个超长的变态的行, 那可能是unix的也可能是mac的格式, 我在winxp上试验的结果是这两种格式引起的外在表现都一样.
 
用cygwin中的file命令, 如上.
 
用cygwin中的 sed -n 1p filename.txt | xxd -g1
 
看最后显示的两个十六进制数是0D 0A还是其中的数加一个0A
 
标准谁订的, 谁必需遵循的
 
不是操作系统, 不是哪个程序, 更不是硬件. 它仅仅是一种约定俗成. 所以你完全可以在一个平台下使用另一个平台的文本格式,  只要所有处理到这个文本文件的程序都要知晓这一约定. 它其实只是各个程序之间的一种约定, 比如你用word创建了一个文件, 另存为纯文本时,  它当然存为DOS格式的了, 而同样是微软的程序记事本也是假设同样的格式, 所以它们能工作的很好, 再往系统下面一点看, C语言中的函数库,  凡是在DOS/WINDOWS平台上的实现, 它也会考虑同样的约定, 这样你用fputs或fgets来写/读文本文件时,  写入的自然也就是<CR><LF>了.
 
其它平台的情形自然也类似.
 
ftp的考虑.
 
一些ftp的客户端程序会自动进行各个平台的文本文件格式转换. 所以要注意你在ftp中用ls看看到的文件大小未必是你下载下来的文件大小. 上传过程也是一样.
 
如果你不想ftp这样自作主张只要用bin命令即可. 它会告诉ftp进行逐字节的高保真二进制模式传输.
 
每个文件都从一而终吗
 
不必然. 我在linux中经常碰到一些文件被莫名其妙地弄得雌雄莫辨, 一些行是DOS格式的, 一些行是UNIX格式的,  这么说可能会让人越来越乱, 怎么可能在UNIX上有DOS格式的呢. 又怎么可能一个文件内部有两种格式呢.  了解了这个问题的实质其实上面所说都只是一些文字上的方便, 或者说文字上造成的不方便.  所谓DOS文本格式无非是可见文字编码(不仅限于ASCII了, 中文文本文件也算是)中间插入了<CR><LF>这两个字符.  而UNIX文本格式也无非是以<LF>作分隔罢了. 它一会以这个分隔一会以那个分隔就是所说的混合格式了.
 
碰到这种文件unix2dos和dos2unix两个工具仍然能应付. 但对于vim就不行了. 简单的:set ff=unix会让它莫衷一是,  因为文件的一部分已经是unix的了. 它也确实是把文件在内部认为是unix格式了. 此时就只能把多余的<CR>干掉了.  它在vim中显示是一个^M字符. 视你的终端和颜色配置情况, 往往还带着扎眼的亮色.
 
:%s#^M##g
 
上面命令中的^M是一个字符, 代表回车, 输入的办法是在UNIX中先按<C-V>再按回车键,  在windows中要先按<C-Q>, 再按回车键, 原因只是在WINDOWS中大家已经习惯用<C-V>来粘贴,  所以VIM把这个键映射到了<C-Q>上.

Posted 2011年01月31日 by gw8310 in 未分类

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: