原文地址:Linux、Windows 和 Mac 中的换行符对比

博客地址:http://www.moonxy.com

一、前言

经常使用 Window、Linux 等不同操作系统的开发者,在处理文本的时候,基本都会遇到不同系统,出现换行格式不一致的问题,原因就出在不同的系统,定义了不同的换行符。

二、Linux、Windows 和 Mac 中的换行符对比

对于换行这个动作,Unix下一般只有一个 0x0A 表示换行("\n"),Windows 下一般都是 0x0D 和 0x0A 两个字符,即 0D0A("\r\n"),苹果机(MAC OS系统)则采用回车符 CR 表示下一行("\r")。

Unix 系统中:每行结尾只有 "<换行>",即 "\n";

Windows 系统中:每行结尾是 "<回车><换行>",即 "\r\n";

Mac 系统中:每行结尾是 "<回车>",即 "\r"。

不同系统所定义的换行格式不同,导致的直接后果是,Unix/Mac 系统下的文件在 Windows 里打开的话,所有文字会变成一行;而 Windows 里的文件在 Unix/Linux 下打开的话,在每行的结尾会多车一个 ^M 字符。

Dos 和 windows 采用 "回车+换行",即 "CR + LF" 表示下一行,即敲一下回车键,相当于同时执行了 "回车+换行",即 ^M$($ 不是换行符的表示,换行符没有表示出来,$ 是文本结束 EOF 的表示)。

而 UNIX/Linux 采用 "换行符",即 "LF" 表示下一行,即 "\n";

苹果机(MAC OS系统)则采用 "回车符",即 "CR" 表示下一行,即 "\r";

CR 用符号 "\r" 表示,十进制 ASCII 代码是 13,十六进制代码为 0x0D

LF 使用 "\n"符号表示,ASCII代码是 10,十六制为 0x0A。所以 Windows 平台上换行在文本文件中是使用 "0D0A" 两个字节表示,而 UNIX/Linux 和苹果平台上换行则分别是使用 0A0D 一个字节表示。

由于 DOS 风格的换行使用 "\r\n",如果把这样的文件上传到 Unix/Linux,有些版本的 vi 不能识别 "\r",所以 vi 显示时在行尾会出现 ^M 出来,但是有些就能识别 \r\n,正常显示回车换行。

附部分 ASCII 码对照表:

三、使用 Notepad++ 查看回车和换行符并相互转换

Notepad++ 中可以设置 Windows、Unix 和 Mac三种行尾换行符格式及其之间的转换,如下:

默认不显示回车及换行符:

1)设置 Notepad++ 显示换行符,这样才能看到效果, 视图 -> 显示符号 -> 显示行尾符,如果是英文版的 Notepad++,则应该是 View -> Show Symbol -> Show End of Line;

2)设置行尾符格式:编辑 ->  档案格式转换 ->(可选 Windows、Unix 和 Mac中的一种),如果是英文版的 Notepad++,则应该是 Edit -> EOL Conversion -> Windows Format、Unix/OSX Format、Old Mac Format。

四、Linux 中去除 DOS/Windows 文档中出现的 "^$"

有时候将 Windows 中编辑好的文本上传到 LInux 服务器中使用,此时就需要将 Windows 中的 "^$" 去除,如下:

[root@ryan linux]# ll win1.txt
-rw-r--r-- root root Apr : win1.txt
[root@ryan linux]# cat win1.txt
aaa bbbb
cccc

使用 cat -A 选项查看文本所有的字符,如下:

[root@ryan linux]# cat -A win1.txt
aaa bbbb^M$
cccc^M$
123^M$

或者使用 cat -v 选项显示出非打印字符,如下:

[root@ryan linux]# cat -v win1.txt
aaa bbbb^M
cccc^M
^M

去除 "^M" 符号,如下:

[root@ryan linux]# cat -v win1.txt | tr -d '^M'  > linux1.txt
[root@ryan linux]# cat -A linux1.txt
aaa bbbb$
cccc$
$

或者使用其 ASCII 码,如下:

[root@ryan linux]# cat win1.txt |tr -d '\015' > linux2.txt
[root@ryan linux]# cat -A linux2.txt
aaa bbbb$
cccc$
$

需要注意:八进制下,^m 是 015;^Z 是 032;tab 是 011;^是136。

此处复习一下进制的相关知识,如下:

在C语言里,整数有三种表示形式:十进制,八进制,十六进制。

其中以数字0开头,由 0~7 组成的数是八进制。以 0X 或 0x 开头,由 0~9,A~F 或 a~f 组成是十六进制。除表示正负的符号外,以 1~9 开头,由 0~9 组成是十进制。

1)十进制:除表示正负的符号外,以 1~9 开头,由0~9组成。如:128,+234,-278。

2)八进制:以 0 开头,由 0~7组成的数。如:0126,050000。

3)十六进制:以 0X 或 0x 开头,由 0~9,A~F 或 a~f  组成。如:0x12A,0x5a000。

Linux、Windows 和 Mac 中的换行符对比的更多相关文章

  1. Unix,windows和Mac中的换行

    Unix 系统里,每行结尾只有“<换行>”,即“\n”:Windows系统里面,每行结尾是“<换行><回车 >”,即“\r\n”:Mac系统里,每行结尾是“< ...

  2. SQL列中含有换行符的查找和替换方法

    最近在获取数据时,发现程序读取的字段中含有\r\n字符,检查数据库表中的数据,发现是varchar字符串中包含了换行符.导入数据导致了这一情况出现. 回车换行 不同系统的行结尾符号并不同,如下: li ...

  3. **PHP中替换换行符

    PHP中替换换行符 php 不同系统的换行不同系统之间换行的实现是不一样的linux 与unix中用 \nMAC 用 \rwindow 为了体现与linux不同 则是 \r\n所以在不同平台上 实现方 ...

  4. textarea 中的换行符问题

    下面是我对这个问题的解决过程,最后算是完全搞懂了,真是阴沟里险些翻船 1.必须知道textarea中的换行符是 \n  (个人检测发现按回车键是\n,好像在linux下是\r\n) 2.用nl2br之 ...

  5. 关于sql中去换行符的问题

    今天要用bootstrap开发一个网页,要使用到JSON,但是JSON的格式不正确,然后在http://www.bejson.com/[Be JSON]中测试了一下JSON. 发现JSON中多了一个换 ...

  6. json中含有换行符'\r','\n'的处理

    一.josn简易说明  json是一种轻量级的数据交换格式,是一系列格式字符串.在数据交换中,经常会使用到,具有易读性,轻量级.很多地方会使用到,用处广泛.如下:(截取的一段json体) " ...

  7. Java经典实例:在文本中匹配换行符

    默认情况下,正则表达式 ^ 和 $ 忽略行结束符,仅分别与整个输入序列的开头和结尾匹配.如果激活 MULTILINE 模式,则 ^ 在输入的开头和行结束符之后(输入的结尾)才发生匹配.处于 MULTI ...

  8. 将html中的br换行符转换为文本输入中的换行符(转)

    PHP中的有个非常好的函数:nl2br(),将文本框中的换行转换为HTML页面的<br />,但是如何实现将html中的<br />换行符转换为文本框中的换行符呢?下面这几个方 ...

  9. WPF中的换行符

    原文:WPF中的换行符 WPF中UI上和后台代码中的换行符不同. 其中: XAML中为 C#代码中为 \r\n 或者: Environment.NewLine 版权声明:本文为博主原创文章,未经博主允 ...

随机推荐

  1. SQL Server 数据完整性的实现——约束

    SQL Server数据库采用的是关系数据模型,而关系数据模型本身的优点之一就是模型本身集成了数据完整性.作为模型一部分而实施的数据完整性(例如在创建数据表时的列属性定义)称作为声明式(Declara ...

  2. React Native 生命周期及相关方法小技巧使用

    ES6 生命周期图解 很多文章里的图解,第一步是 getDefaultProps , 第二步是 getinitialstate ,这是 ES5 的写法; 实际上ES6 中 getinitialstat ...

  3. Git随身手册

    Git随身手册 本文是关于Git探索的一篇文章,阐述了Git的大部分命令和使用方式,并列举了几个典型的使用场景以供参考和体会. 对于Git这个分布式的VCS,从链表的角度来看待是最容易理解的: 一次c ...

  4. cf 1102 B

    题意:求字符串中任意相邻两位是否可以可以由前一个加上任意个x或y屏蔽十位与后一位相等,如果可以需要添加的最少数字是多少,x值为0-9,y值也为0-9,求出任意x,y对应情形下字符串需要添加的最少数字, ...

  5. Hadoop RPC机制详解

    网络通信模块是分布式系统中最底层的模块,他直接支撑了上层分布式环境下复杂的进程间通信逻辑,是所有分布式系统的基础.远程过程调用(RPC)是一种常用的分布式网络通信协议,他允许运行于一台计算机的程序调用 ...

  6. LInux ACL权限控制

    1.ACL简介 ACL是一种可以实现灵活的权限管理(文件的额外赋权机制)除了文件所有者,所属组和其他人,可以对更多的用户设置权限,这就是访问控制列表(Access Control List) 2.AC ...

  7. 带你入门SpringCloud服务发现 | Eurka搭建和使用

    前言 服务注册与发现是微服务中最为基础的环节,而 Eureka 就是一个可以帮助你实现服务注册与发现的选择之一.如果你对 Eureka 和服务发现了解甚少,那么该篇博客将会帮助到你.文中通过具体操作带 ...

  8. P3980 [NOI2008]志愿者招募 费用流 (人有多大胆地有多大产

    https://www.luogu.org/problemnew/show/P3980 感觉费用流比网络流的图更难想到,要更大胆.首先由于日期是连续的,所以图中的点是横向排列的. 这道题有点绕道走的意 ...

  9. CodeForces 149E Martian Strings exkmp

    Martian Strings 题解: 对于询问串, 我们可以从前往后先跑一遍exkmp. 然后在倒过来,从后往前跑一遍exkmp. 我们就可以记录下 对于每个正向匹配来说,最左边的点在哪里. 对于每 ...

  10. Atcoder D - Widespread (二分)

    题目链接:http://abc063.contest.atcoder.jp/tasks/arc075_b 题解:直接二分答案然后再判断(a-b)来替代不足的.看代码比较好理解,水题. #include ...