The-text-Compatibility-of-Linux-and-Windows
1. 字符编码问题: Linux系统与windows系统的默认编码不同。 1.1 Linux系统下查看文件编码命令file 1.2 文件字符编码转换 1.2.1 文件内容的字符编码转换: iconv 1.2.2 文件名称的字符编码转换: convmv 1.3 操作系统的字符集问题 2. 换行格式问题 2.1 现象 2.2 原因 2.3 举例 2.4 转换 2.5 换行历史 3. 混用供参考
在同时使用Windows与Linux双系统时,会遇到2种系统下文本文件互相不太兼容的问题。
主要是字符编码(文件内容及文件名)问题; 还有文件内容的换行格式问题。
注: 使用chrome可以查看几乎所有编码格式的文本文件, 只是不能编辑。
1. 字符编码问题: Linux系统与windows系统的默认编码不同。
- Windows系统的字符编码默认是GBK(gb2312),
- 而Linux系统的字符编码默认是UTF-8。
如果在双系统的其中一个系统下能正常现实中文,而在另外一个系统下则显示为乱码,通常是文件的编码有问题。
1.1 Linux系统下查看文件编码命令file
新版本的Unix命令File做字符编码的检测.(cygwin与mac都有此命令)
$ file linux.txt
linux.txt: Unicode text, UTF-8 text
这个文件的字符编码是UTF-8,在Linux系统下查看应该没有问题。
$ file win.txt
win.txt: ISO-8859 text, with CRLF line terminators
这个文件的字符编码ISO-8859, 不是UTF-8, 在Linux系统下使用gedit, geany, notepadqq等查看显示为乱码;但使用pluma可正常查看.
1.2 文件字符编码转换
1.2.1 文件内容的字符编码转换: iconv
Linux系统下命令: (iconv), 程序与编程API,用于字符编码转换
$ iconv -f GB2312 -t UTF-8 win-old.txt -o lin-new.txt
$ file lin-new.txt
lin-new.txt: Unicode text, UTF-8 text, with CRLF line terminators
另外: windows系统下: 直接使用记事本另存为即可, 使用记事本打开文件->另存为,编码方式选择UTF-8。
1.2.2 文件名称的字符编码转换: convmv
将文件名从一种编码转换为另一种。
convmv -f 源编码 -t 新编码 [选项] 文件名
常用参数:
-r 递归处理子文件夹
–notest 真正进行操作,请注意在默认情况下是不对文件进行真实操作的,而只是试验。
–list 显示所有支持的编码
–unescap 可以做一下转义,比如把%20变成空格
1.3 操作系统的字符集问题
另外,文件出现编码错误的原因还可能是当前操作系统的字符集有问题. 可参考此文处理: Locale
https://www.cnblogs.com/sztom/p/12174045.html
2. 换行格式问题
2.1 现象
在Linux环境下使用图形界面的文本编辑器或许看不出差异, 但若在Terminal终端下查看Windows格式(即CRLF回车换行)的文本文件,每行行尾都会多出个^M; 普通文本或许影响不大, 但若是脚本文件, 使用时就会报错了.
而在Windows环境下查看Linux格式(即LF换行)的文本文件, 就非常不方便了, 只有长长的一行了(相当于没有了所有的换行).
2.2 原因
- 在Linux中,文本文件换行用" ": [换行LF (Line feed, U+000A) 0x0a (10)]
- 而Windows用" "表示回车换行: [回车CR (Carriage Return, U+000D) 0x0d (13); 换行LF (Line feed, U+000A) 0x0a (10)]
2.3 举例
还是拿上面用过的文件举例,已经转换为UTF-8, 使用文本编辑器查看是没有问题了,
$ file lin-new.txt
lin-new.txt: Unicode text, UTF-8 text, with CRLF line terminators
这里看到行尾是CRLF, 即回车换行, 还是Windows的格式, 所以vi等命令行下查看时, 将多出来的的回车识别为(^M)
2.4 转换
如下2个命令将文本在 DOS 和 Unix 格式之间转换。
dos2unix : CRLF --> LF
unix2dos : LF --> CRLF
$ file lin-new.txt
lin-new.txt: Unicode text, UTF-8 text, with CRLF line terminators
$ dos2unix lin-new.txt
dos2unix: converting file lin-new.txt to Unix format...
$ file lin-new.txt
lin-new.txt: Unicode text, UTF-8 text
注: 还有更多相关命令: tr, od, awk, seg, vim, enca...
- type: 可查看命令类型
- file: 查看文件编码及格式
- stat: 查看文件状态
2.5 换行历史
回车”(Carriage Return)和“换行”(Line Feed)这两个概念的来历和区别。
在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33,Linux/Unix下的tty概念也来自于此)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
Unix系统里,每行结尾只有“<换行>”,即" ";Windows系统里面,每行结尾是“<回车><换行>”,即“ ”;Mac系统里,每行结尾是“<回车>”,即" ";。一个直接后果是,Unix/Mac系统下的文件在 Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。
3. 混用供参考
普通文件: 字符编码都使用UTF-8(Linux默认模式); 换行保持CTLF(Windows模式)。这样2种系统下都可以正常查看并编辑。
脚本文件: 字符编码都使用UTF-8(Linux默认模式); 若是bat的windows脚本使用CTLF(Windows模式); 若是sh的Linux脚本则使用LF(Linux模式)。
注: 脚本文件尽量使用全英文的就不会有编码问题了。
https://www.cnblogs.com/sztom/p/12154470.html#210
Unicode 3.2 字符转换工具
https://zh.wikipedia.org/wiki/字符编码#字符转换工具
https://en.wikipedia.org/wiki/Character_encoding#Character_encoding_translation
Locale
https://www.cnblogs.com/sztom/p/12174045.html
==========
下文有提供更多种转换方式: 如何将文本文件在 Unix 和 DOS(Windows)格式之间转换
作者: Magesh Maruthamuthu 译者: LCTT geekpi | 2020-08-27
https://linux.cn/article-12558-1.html