加载中…
个人资料
Ying
Ying
  • 博客等级:
  • 博客积分:0
  • 博客访问:45,224
  • 关注人气:5
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

不用操作系统下的回车换行(CR,LF)

(2010-06-24 10:02:54)
标签:

回车

换行

cr

lf

杂谈

分类: CommonTech

以前看到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(有些版本是在Format -> Convert to..)菜单中, 有三个子菜单项就是专供你在各种文本格式之间转换的.

在vim中, 如果你想把一个文件存为另一种文件格式, 只需:set fileformat=unix或等号后面是dos, mac即可, 接下来的存盘动作就会自动把你的文件存为指定平台的格式.

 

查看一个既有文件的格式:

unix: file filename

注意第一个file是一个命令, 它会报告给定的文件的类型. 实际上它维护了一个各种文件类型特征的一个数据库, 可以告诉你任何文件的类型(当然前提是得先编进入数据库), 不光是文本文件格式这种小儿科

windows:

办法一: 可以用记事本打开, 如果正常就是一个DOS格式的, 如果出现一个超长的变态的行, 那可能是unix的也可能是mac的格式, 我在winxp上试验的结果是这两种格式引起的外在表现都一样.

办法二:使用编辑器例如NotePad++查看,通过菜单 VIEW -> Show all characters显示所有字符,通过回车换行符的格式查看。

办法三:用cygwin中的file命令, 如上.

办法四:用cygwin中的 sed -n 1p filename.txt | xxd -g1

看最后显示的两个十六进制数是0D 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>上.

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有