Linux 和 Windows .txt 文件(Unicode 编码)有什么区别?

Linux 和 Windows .txt 文件(Unicode 编码)有什么区别?

我只使用原始 ANSI 标准中定义的 128 个字符集。

但从整体上看,这些文件的实现方式有何不同?

我不关心显示,即一个标签是否显示 6 个或 8 个字符,而是内存中的实际内部表示

我听说过的一个区别是使用 \r\n (Windows) 与 \n 作为行终止符 (Linux)。

答案1

Windows 上的“Unicode”是 UTF-16LE,每个字符占 2 或 4 个字节。Linux 使用 UTF-8,每个字符占 1 到 4 个字节。

“每个软件开发人员绝对、肯定必须了解的关于 Unicode 和字符集的最低限度知识(没有借口!)”

答案2

换行符

Windows 使用 CRLF ( \r\n, 0D 0A) 行尾,而 Unix 仅使用 LF ( \n, 0A)。

字符编码

大多数现代(即自 2004 年左右以来)类 Unix 系统都UTF-8默认字符编码。

然而,Windows 缺乏对 UTF-8 的原生支持。它内部使用 UTF-16,并假设基于charUTF-8 的字符串处于遗留状态代码页。幸运的是,记事本能够读取 UTF-8 文件;不幸的是,“ANSI”编码仍然默认值。

有问题的特殊字符

U+001A 替代

Windows(很少)使用Ctrl+Z作为文件结束符。例如,如果您type在命令提示符下打开一个文件,它将在第一个1A字节处被截断。

在 Unix 上,Ctrl+Z没有什么特别的。

U+FEFF 零带无间断空格(字节顺序标记)

在 Windows 上,UTF-8 文件通常以“字节顺序标记”开头,EF BB BF以区别于 ANSI 文件。

在 Linux 上,不建议使用 BOM,因为它会破坏 shell 脚本中的 shebang 行等内容。另外,当 UTF-8 是默认编码时,使用 UTF-8 签名毫无意义。

答案3

我听说的一个区别是使用 \r\n (Windows) 与 \n 作为换行符 (Linux)。

是的。大多数 UNIX 文本编辑器会自动处理这个问题,Windows 程序员编辑器可能会处理这个问题,但一般的文本编辑器(基本记事本)不会。

Windows 似乎也需要 EOF(Ctrl-Z)文件结束在某些情况下,但您可能永远不会在 UNIX 上看到它。

请记住,MacOS X 现在是 UNIX 系统,因此它使用 UNIX 行尾。虽然在 OS X(MacOS 9 及以下版本)之前它有自己的行尾 (\r)

编辑:其他格式的 CR 和 LF:

  • \n 为 ASCII 0x0A,换行符 (LF)
  • \r 为 ASCII 0x0D,回车符 (CR)

答案4

Linux使用UTF-8,每个字符在1到6个字节之间,而不是在1到4个字节之间。

U00000000 - U0000007F: 0xxxxxxx
U00000080 - U000007FF: 110xxxxx 10xxxxxx
U00000800 - U0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U00010000 - U001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U00200000 - U03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U04000000 - U7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

相关内容