我只使用原始 ANSI 标准中定义的 128 个字符集。
但从整体上看,这些文件的实现方式有何不同?
我不关心显示,即一个标签是否显示 6 个或 8 个字符,而是内存中的实际内部表示
我听说过的一个区别是使用 \r\n (Windows) 与 \n 作为行终止符 (Linux)。
答案1
Windows 上的“Unicode”是 UTF-16LE,每个字符占 2 或 4 个字节。Linux 使用 UTF-8,每个字符占 1 到 4 个字节。
答案2
换行符
Windows 使用 CRLF ( \r\n
, 0D 0A
) 行尾,而 Unix 仅使用 LF ( \n
, 0A
)。
字符编码
大多数现代(即自 2004 年左右以来)类 Unix 系统都UTF-8默认字符编码。
然而,Windows 缺乏对 UTF-8 的原生支持。它内部使用 UTF-16,并假设基于char
UTF-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