在 Linux 下处理从 Windows 平台通过 TCP socket 传送过来的文字档案,主要是利用演算法对文字中的字串进行变换,演算法在 linux 下实测通过,但联调的时候一直不对…… 通过除错发现从文字档案中读出来的字串长度不对,多了一个位元组。搜了一下发现:
换行符在 Linux 和 Windows 下的区别
一、区别
换行符:
1.windows 中的换行符是 rn,
2. linux/unix 下的换行符是 n 。
其中:
回车符:r=0x0d (13) return; #回车(carriage return)
换行符:n=0x0a (10) newline 。 #换行(newline)
二、档案格式互转命令
1.unix2dos:将具有 unix 风格的格式档案转化为具有 window 下的格式档案。
2.dos2unix:将具有 windows 风格的格式档案转化为 unix 下的格式档案。
Reply-text mb10 程式码
windows 的换行符是 rn Linux 采用的是 n
可以采用 unix2dos 或 dos2unix 转换文字档案

三、回车换行符的历史背景
早期的计算机输出装置不是显示器,而是电传打字机,结构与普通的打字机差不多。有一个列印头在纸上打字,同时有一个电动机控制纸张的进出。当列印头到达行尾的时候,需要两个动作才能够到达下一行的行首:首先执行回车动作,将列印头移动到本行的行首,然后进行换行动作,电动机将纸张向上移动一行,这样列印头就处于下一行的行首,可以继续进行列印。回车和换行对应的控制字元分别是 r 和 n,这就是 windows 中换行符为 rn 的由来。后来由于经常连续执行,所以在印表机中将这两个控制字元简化为一个控制字元,这就是 linux/unix 中的换行符 n 的由来。
Unix 系统里,每行结尾只有 “<换行>”,即 “n”;Windows 系统里面,每行结尾是 “ <回车><换行>”,即 “rn”;Mac 系统里,每行结尾是 “<回车>” 。一个直接后果是,Unix/Mac 系统下的档案在 Windows 里开启的话,所有文字会变成一行;而 Windows 里的档案在 Unix/Mac 下开启的话,在每行的结尾可能会多出一个^M 符号.
四、引起的现象和问题:
1. 问题一
​ 做一个日志档案的时候发现由 printWriter 写出来的档案在 windows 上开启 是混乱的,因为在 linux 下执行 printLn 方法时 写入的换行符是 n ,在 windows 没法识别 rn 才能被认为是换行
2. 问题二
有时在 WIN 下编辑好的指令码档案上传到 LINUX 站群服务器中不能正常执行,开始误认为是 LINUX 配置问题,后来发现,是 WIN 与 LINUX 储存档案时的换行符标志不同造成的。在 DOS 使用的换行符为 ^M$,我们称为 CR 与 LF 两个符号。而在 Linux 中,则仅有 LF ($) 这个换行符。
可以用如下命令完成格式转换:$dos2unix,$unix2dos 。但这两个命令在 Ubuntu 发行版本中不存在,可通过:
$sudo apt-get install tofrodos
命令安装。之后,再次使用如下文所示的格式即可。
[root@linux ~]# dos2unix [-kn] file [newfile]
[root@linux ~]# unix2dos [-kn] file [newfile]
引数:
-k : 保留该档案原来的 mtime 时间格式 (不更新档案上次内容经过修改的时间)
-n : 保留原来的旧档案,将转换后的内容输出到新档案,如:dos2unix -n old new
范例:
范例一:将提供的 hosts 档案格式更新为 dos 格式。
[root@linux ~]# unix2dos -k hosts
unix2dos: converting file hosts to DOS format …
# 此时 hosts 档案的时间不会改变,但内容主要将换行符修改成为 DOS 的 CRLF 了。
范例二:将范例一已经变成 DOS 格式的 hosts 改名为 hosts.dos,并且转换 Linux
格式到 hosts.linux
[root@linux ~]# mv hosts hosts.dos
[root@linux ~]# dos2unix -k -n hosts.dos hosts.linux
dos2unix: converting file hosts.dos to file hosts.linux in UNIX format …
[root@linux ~]# ll
-rw-r–r– 1 root root 288 Aug 1 13:30 hosts.dos
-rw——- 1 root root 279 Aug 1 13:30 hosts.linux
# 由于 DOS 格式中多了 CR 字元,所以,档案比较大。
3. 现象三
先生成一个换行 (n, 0x0A) 和回车 (r, 0x0D) 组合的文字
$ echo -en ’12n34r56nr78rn’ > tmp
以十六进位制方式检视文字
$ od -t x1 tmp
0000000 31 32 0a 33 34 0d 35 36 0a 0d 37 38 0d 0a
0000016
五、程式设计相关
文字档案的行结束符, 传统上 PC 机 用 CRLF,苹果机用 CR,unix 用 LF 。【CR — 回车符,c 语言’r’】。【LF — 换行符, c 语言’n’】。
不同计算机上 c 语言统一规定为::文字档案的行结束符一律变成一个符号 LF, 也就是换行符, 也就是 new line 符, 也就是’n’. “回车和换行符转换成一个换行符”
— 对 PC 机而言, 文字档案行结束符,CRLF 读入后, 丢掉 CR, 留 LF. 例如 fgets() 读入一行, 行尾只有 LF, 没有 CR.
在解析文字或其他格式的档案内容时,常常要碰到判定回车换行的地方,这个时候就要注意既要判定”rn” 又要判定”n” 。写程式时可能得到一行, 将其进行 trim 掉’r’, 这样能得到你所需要的 string 了。
‘n’ 10 换行(newline)
‘r’ 13 回车(return)
最后:
ctrl+M: ^M 也称回车键