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


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

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

    一、前言

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

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

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

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

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

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

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

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

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

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

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

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

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

    附部分 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-- 1 root root 21 Apr 20 22:09 win1.txt
    [root@ryan linux]# cat win1.txt
    aaa bbbb
    cccc
    123

    使用 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
    123^M

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

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

    或者使用其 ASCII 码,如下:

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

    需要注意:八进制下,^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。

  • 相关阅读:
    手机端html滑动处理
    css控制div上下移动
    倒计时javascript
    PHP解决抢购等阻塞式高并发redis处理思路
    jQuery判断当前元素是第几个元素
    CSS 实现盒子水平居中、垂直居中和水平垂直居中的方法
    yii1.* session无法调用问题
    百度小程序坑坑坑
    php等比缩放图片
    lavarel的小失误
  • 原文地址:https://www.cnblogs.com/cnjavahome/p/8893813.html
Copyright © 2020-2023  润新知