\r\n <->\r转换
2011-08-15 17:56
134 查看
Windows/DOS与Unix文件格式是不同的,问题一般就是出在/r/n问题上。
回车(CR)和换行(LF)符都是用来表示“下一行”的。而标准没有规定要使用哪一个。于是产生了三种不同的用法:Dos和windows采用回车+ 换行(CR+LG)表示下一行(亦即所谓的PC格式,谁让MS最早雄踞PC市场呢,^_^),UNIX采用换行符(LF)表示下一行,MAC机采用回车符(CR)表示下一行。当在不同的系统间传递文件,就要涉及格式的转换。
先搞清楚几个符号
*******************
0D CR ^M 回车
*******************
DOS/Windows文本文件中使用CR(回车\r)和 LF(换行\n),
在文件的行尾的情况是是 '\r\n'
UNIX文本只使用换行符,在行的末尾有一个换行(\n),也就是'\n'
所以在windows下编辑的C程序放在unix下编译会出现"No end of newline"的Warning
两种文件格式之间的转化
Unix -> Dos
'\n' -> '\r\n'
//////////////////////////////////////////
while ( (ch = fgetc(in)) != EOF )
{
if ( ch == '\n' )
putchar('\r');
putchar(ch);
}
//////////////////////////////////////////
只要在Unix文件中出现的'\n'的之前加入一个'\r'字符就可以了
Unix <- DOS
'\n' <- '\r\n'
从Dos到Unix的情况复杂点,不能只是把从文件中读出的'\r'去掉就可以了
因为Dos文件中的文本行的末尾有时会内嵌一个回车符号,这种情况在击打式打印机中出现。
所以在转换前要判断'\r'是否和'\n'同时出现。
如果同时出现,则去掉'\r'
如果没有同时出现,保留'\n'
//////////////////////////////////////////
cr_flag = 0; /* No CR encountered yet */
while ( (ch = fgetc(in)) != EOF )
{
if ( cr_flag && ch != '\n' ) {
/* This CR did not preceed LF */
putchar('\r');
}
if ( !(cr_flag = (ch == '\r')) )
putchar(ch);
}
Java中获取行结束符:System.getProperty("line.separator")
更多参考:http://xu020408.blog.163.com/blog/static/26548920094574343117/
回车(CR)和换行(LF)符都是用来表示“下一行”的。而标准没有规定要使用哪一个。于是产生了三种不同的用法:Dos和windows采用回车+ 换行(CR+LG)表示下一行(亦即所谓的PC格式,谁让MS最早雄踞PC市场呢,^_^),UNIX采用换行符(LF)表示下一行,MAC机采用回车符(CR)表示下一行。当在不同的系统间传递文件,就要涉及格式的转换。
先搞清楚几个符号
*******************
0D CR ^M 回车
*******************
DOS/Windows文本文件中使用CR(回车\r)和 LF(换行\n),
在文件的行尾的情况是是 '\r\n'
UNIX文本只使用换行符,在行的末尾有一个换行(\n),也就是'\n'
所以在windows下编辑的C程序放在unix下编译会出现"No end of newline"的Warning
两种文件格式之间的转化
Unix -> Dos
'\n' -> '\r\n'
//////////////////////////////////////////
while ( (ch = fgetc(in)) != EOF )
{
if ( ch == '\n' )
putchar('\r');
putchar(ch);
}
//////////////////////////////////////////
只要在Unix文件中出现的'\n'的之前加入一个'\r'字符就可以了
Unix <- DOS
'\n' <- '\r\n'
从Dos到Unix的情况复杂点,不能只是把从文件中读出的'\r'去掉就可以了
因为Dos文件中的文本行的末尾有时会内嵌一个回车符号,这种情况在击打式打印机中出现。
所以在转换前要判断'\r'是否和'\n'同时出现。
如果同时出现,则去掉'\r'
如果没有同时出现,保留'\n'
//////////////////////////////////////////
cr_flag = 0; /* No CR encountered yet */
while ( (ch = fgetc(in)) != EOF )
{
if ( cr_flag && ch != '\n' ) {
/* This CR did not preceed LF */
putchar('\r');
}
if ( !(cr_flag = (ch == '\r')) )
putchar(ch);
}
Java中获取行结束符:System.getProperty("line.separator")
更多参考:http://xu020408.blog.163.com/blog/static/26548920094574343117/
相关文章推荐
- How Tomcat works学习笔记<三>
- <<突破思维障碍>>之思维导图
- 泛型集合List<T> Dictionary<K,V>
- V4L2 API详解 <一> 背景知识
- Hive排序<转>
- Java的<init>,<cinit>与类的初始化顺序
- Scala学习整理[第二十四-二十六章 抽取器和XML]<Programming In Scala>
- kaggle数据挖掘竞赛初步--Titanic<数据变换>,kaggle--titanic
- (Boolan)C++设计模式 <十二> ——命令模式(Command)和访问器(Visitor)
- SpringBoot系列<五>全局异常处理
- 启动tomcat后Myeclipse调试Class<T>.getDeclaredConstructors0 的原因
- 获取手机信息<uses-permission android:name="android.permission.READ_PHONE_STATE" />
- <我的抗战>
- 第13周 项目5-字符串操作(1)-<统计A的个数>
- <LeetCode OJ> 290. Word Pattern
- <笔试><面试>C/C++单链表(最综合)最全工程从建立到相关函数实现
- TestNG中的DataProvider返回Iterator<Object[]>的妙用
- 诡异的【session丢失】和无语的【&lt;img src=""&gt;标签】
- 宗次郎 <故乡的原野>
- <textarea>不能用<textarea/>关闭 ,而是必须用<textarea></textarea>