Windows系统和Linux系统的文件格式是有差别的,主要表现在字符编码和换行符表示。字符编码大家可能比较好理解,毕竟字符编码经常接触,不管是什么系统都会涉及到。而换行符的问题,在跨系统使用的时候,经常会让人莫名其妙。我现在就是做Linux服务器开发,在Windows上编写代码等,再上传到服务器上。而经常写的脚本文件,放在Linux上却出现不正常。无非就是编码和换行符的问题。

    下面就文本编辑器来介绍一下,给跨系统使用的人一个参考,如果你清楚,就不必看了。因为本文就是解决字符编码和换行符问题的。

    在Windows中,我最习惯使用的记事本还是系统自带的。简单快速,这就是我喜欢记事本的原因。很多时候,我们从网页上或者一些软件比如Word上复制的内容,都是带格式的。如果你直接粘贴到其他地方,往往会把格式带过去,就很麻烦。很早之前我也做了一个记事本软件,我推荐给同学用的时候,他跟我说了一句话“我最喜欢用系统自带的记事本,我经常拿他来刷格式”。后来每次在用记事本刷掉格式的时候,我都会想起他那句话。

    如果是日常个人使用的话,记事本也就可以用来记事了。如果只是在Windows上开发,记事本也完全够用。然而你会遇见这样的问题:

    Notepad++编辑的内容

【Notepad++编辑的内容】

记事本查看的内容

【记事本查看的内容】

    明明其他各种软件都能够换行显示,但是在记事本就是不换行,怎么弄都不换行。此时你是不是看的很不爽。这个是换行符的问题。

    不同系统的换行是不一样的:

Windows     CR(\r)和LF(\n)
Unix(Linux) LF(\n)
Mac         CR(\r)

    在Windows中,\r\n才会换行,记事本就是按照这个来换行的。单个的\r或\n都不会换行。Unix或Linux则只认\n,Mac只认\r。所以不同系统创建的文本文件,换行符默认的不一样。所以也就导致其他系统的文本文件在Windows系统中会显示不正常,效果就和上面图片所示的那样,也就是换行失效。然而如果Windows上的文本文件换行在Linux上能表现正常吗?

    效果不就是多了一个字符嘛。但是如果Linux(Unix)和Mac相互混用,也会出现换行不了的问题。而如果出现换行问题,直接用记事本是没有办法解决的。你从其他地方复制的内容,即使不带格式信息,但是换行符会带过来,这个却是没有办法解决的。所以在经常处理跨系统环境使用文本文件,比如配置文件,Shell脚本文件,就会经常需要解决这个问题。

    这才让很多有这样经历的人放弃了记事本。本文提到的就是Notepad,还有一个就是UltraEdit。因为这些记事本软件可以对换行符进行转换。这样就可以轻松在不同系统中处理文本文件。

    Notepad可以在状态栏右击来切换换行符:

Notepad可以在状态栏右击来切换换行符

【Notepad可以在状态栏右击来切换换行符】

    其他软件自然也有切换换行符的,如果没有这个功能,还不如用记事本。VS在文件菜单下的高级选项可以切换换行符。

    那么剩下的一个问题就是字符编码问题。

    记事本有几种字符编码选择,在第一次保存文件或者另存为时可以看到和选择:

记事本有几种字符编码选择

    ANSI并不是字符集编码,而是本地编码。本地化编码使用系统使用的字符集编码,中文使用的是GB2312,剩余的是三种Unicode编码。Unicode编码大家都好理解。如果是英文系统,ANSI就本地化对应的是ASCII编码。

    所以在不同的环境中,一定要使用正确的编码,否则会出现乱码。比如Shell经常出现乱码导致命令不能正常执行。甚至在Linux查看Windows上传的文件时显示的中文是乱码。如果用正确的编码查看,自然也就没有乱码了。

    而在Notepad这些软件里,可以方便的切换编码:

在Notepad这些软件里,可以方便的切换编码

    状态栏显示了GB2312(Simplified)简体中文字符集编码,在上面第一个框中没有显示出来。所以没有勾选。如果是上面其中一种编码格式,就会勾选。而下面的框则是转换编码的。就这样可以切换编码。而我们常用的上最上面两种。

    特别需要解释一下UTF-8的BOM。BOM(Byte Order Mark,就是字节序标记)是用来表示字节序列的,主要用在网络传输是确认大端还是小端。这个字节序列就是在UTF-8编码的文本文件前面3个字节。不同的值表示不同的功能。而记事本将这个前面的字节拿来区分unicode编码文本文件和ANSI文本文件,如果开头是FFFE,表明是Unicode编码的文本文件,如果不是,则不是Unicode编码的文本文件,一般就是ANSI编码文件了。

    有的软件不识别前面的字节序,有的软件必须识别前面的字节序,所以如果不做好处理,要么就是将字节序当做数据处理而出错,要么就是将数据作为字节序识别而出错。所以我们需要注意。

    Linux中默认的是UTF-8无BOM编码。Windows的UTF-8是带BOM的。如果记不清楚,可以将这些文本文件放在Notepad这类软件查看一下就知道了。然后做好转换,不要被这些乱码折腾而浪费时间。

    而一些环境如html、Python代码文件,都会在开头注明本文件使用的编码格式,此时保存时一定要保存对编码。