Chinaunix首页 | 论坛 | 博客
  • 博客访问: 279766
  • 博文数量: 72
  • 博客积分: 2387
  • 博客等级: 大尉
  • 技术积分: 720
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-26 10:54
文章分类

全部博文(72)

文章存档

2012年(1)

2011年(1)

2010年(70)

分类:

2010-08-26 12:48:15

以前也看到EditPlus里面文本文件可以设置PC/UNiX/MAC三种格式,UltraEdit中可以设置DOS格式和Unix格式,一直不知道区别在那里。
    今天在使用boost::tokenizer按'\n'切割字符时,发现从文件中读到的字符串无法进行正常切割。回想起在用EditPlus打开文件时,会提示文件中包含不合法的回车换行符,是否进行转换云云。看来碰到格式的问题了。当时只好采用别的方法绕了过去。回来查找资料,终于被我找到了。
    原来回车(CR)和换行(LF)符都是用来表示“下一行”的。而标准没有规定要使用哪一个。于是产生了三种不同的用法:Dos和windows采用回车+ 换行(CR+LG)表示下一行(亦即所谓的PC格式,谁让MS最早雄踞PC市场呢,^_^),UNIX采用换行符(LF)表示下一行,MAC机采用回车符(CR)表示下一行。当在不同的系统间传递文件,就要涉及格式的转换。
     又长见识了。。

原始链接如下:
Unix和Windows間的文字檔轉換
在用電報通訊的年代,人們發明了一種用7bits把常用的英文和標點編碼的方法 — 這就是至今還在電腦世界應用的ASCII。

電報機每當打印到一行結尾時便需要「跳進下一行」並「回到第一格」,因此ASCII有LF(Line Feed, 0×0A) 和CR(Carriage Return, 0×0D)。在電腦的世其實並不需要用兩個字符代表「下一行」的意思,為了省資源,在設計OS時一些人就決定用其中一個字符代表「下一行」1,因為大家選擇不同,做成了不同系統的「下一行」符號不同的問題。

這 問題常見於在 Windows 上傳一些檔案到 Unix Server 中,如果不經轉換 Unix 會見到一些古怪符號 (顯示成^M的CR字符)。如果己經有一堆Windows的文字檔,怎樣把它們轉換成Unix的文字檔?不用自己寫轉換軟件,你可以使用Unix command tr (translate) 或 sed (Stream Editor):

# USE tr TO REMOVE CR CHARACTER
tr -d '\r' < oldfile > newfile


# USE sed, IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format
sed 's/.$//' # assumes that all lines end with CR/LF
sed 's/^M$//' # in bash/tcsh, press Ctrl-V then Ctrl-M

# USE sed, IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format
sed "s/$/`echo -e " # command line under ksh
sed 's/$'"/`echo " # command line under bash

 


有个系统的数据丢失了,搞来了原始报告,查了一下系统文档。

命令是这样的:commit -f /u/cmoas/cfg/ooconfig -t T0011 /u/cmoas/his/T0011/2009_01_31.T0011

结果不成功,检查log,发现日期解析成了“20-00-00 00:00:00”。

在想是不是需要dos2unix一下,结果AIX下居然没有这个命令。

google一番找到了如下一段话:

 没听说过AIX有这种命令,你可以自己动手

以前,老式的电传打字机使用两个字符来另起新行。一个字符把滑动架移回首位

(称为回车, ),另一个字符把纸上移一行 (称为换行, )。

? ?当计算机问世以后,存储器曾经非常昂贵。有些人就认定没必要用两个字符来表示

行尾。UNIX 开发者决定他们可以用 一个字符来表示行尾。开发 MS-DOS (以及微软视窗) 的那些家伙则决定沿用老式的

所以从DOS到UNIX的格式转换需要把 (ASCII 13,八进制15)去掉,用tr命令就可以完成。

tr -d '\015' unix.txt

而从UNIX到DOS格式转换需要在后追加上一个,我试了sed等命令好像不支持\012这种转义字符,你可以用C语言来做,非常之简单,其核心部分如下:

...

??c = fgetc(fFileR);

??while( !feof(fFileR) )

??{

? ? fputc(c,fFileW);

? ? if(c=='\n')fputc ('\r',fFileW);

? ? c=fgetc(fFileR)

??}

...

还有如下一段话

那个^M是DOS(WINDOWS)文件上传时没有将回车+换行符转换而产生的。如果使用FTP上传的话,对这样的文本文件,应该使用ASCII方式,这样上传时FTP会根据两边的文件系统的格式进行必要的转换,上传后的UNIX文件中就没有那个^M了。这就是FTP中那个“P”的作用(Protocol,协议)。
对二进制文件(图形、压缩、执行等),FTP传送时一定要用BINARY方式,不然它会自作聪明地转换的。
如果是采用自己的通信软件传送,那么在处理DOS的回车+换行符(\r\n,16进的0Dh 0Ah)时把\r(0Dh)去掉不传就可以了。

阅读(1961) | 评论(0) | 转发(0) |
0

上一篇:cpu字节存放顺序

下一篇:0长数组

给主人留下些什么吧!~~