• The-text-Compatibility-of-Linux-and-Windows


    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

    sztom osoft@qq.com CC-BY-NC-SA
  • 相关阅读:
    《Think in Java》(十四)类型信息
    《Think in Java》(十三)字符串
    《Think in Java》(十二)通过异常处理错误
    《Think in Java》(十七)容器深入研究
    《Think in Java》(十一)持有对象
    集合框架概览
    Gulp 自动化构建过程
    自动化打包 CSS
    更新 Node 稳定版本命令
    mac 命令行打开vscode
  • 原文地址:https://www.cnblogs.com/sztom/p/14702607.html
Copyright © 2020-2023  润新知