Windows:默认为 ANSI,记事本程序另存为处,可以设置其他编码格式;
Ubuntu:默认为 UTF-8
1)ANSI
ANSI 编码表示英文字符时用一个字节,表示中文用两个或四个字节 —— 这带来了存储空间的减少,但却带来的格式的不统一和混乱。ANSI是一种字符代码,为使计算机支持更多语言,通常使用 0x00~0x79 范围的 1 个字节来表示 1 个英文字符。超出此范围的使用 0x80~0xFFFF来编码,即扩展的 ASCII 编码。为使计算机支持更多语言,通常使用 0x80~0xFFFF范围的 2 个字节来表示 1 个字符。比如:汉字 ‘中’ 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。
不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准。这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文 Windows 操作系统中,ANSI 编码代表 GBK 编码;在繁体中文 Windows 操作系统中,ANSI 编码代表 Big5;在日文 Windows 操作系统中,ANSI 编码代表 Shift_JIS 编码。
2)UTF-8格式编码和UTF-8无BOM格式编码
BOM——Byte Order Mark,就是字节序标记。我发现Unicode、Unicode big endian和UTF-8编码的txt文件的开头会多出几个字节,分别是FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)。但这些标记是基于什么标准呢?
在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF,FFFE,在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。UTF-8编码的文件中,BOM占三个字节。如果用记事本把一个文本文件另存为UTF-8编码方式的话,用UE打开这个文件,切换到十六进制编辑状态就可以看到开头的EF BB BF了。这是个标识UTF-8编码文件的好办法,软件通过BOM来识别这个文件是否是UTF-8编码,很多软件还要求读入的文件必须带BOM。可是,还是有很多软件不能识别BOM。
3)最合适的编码--【UTF-8 without BOM】
UTF-8 without BOM`(或通常写作 “UTF-8 无 BOM”)是指使用 UTF-8 字符编码的文本文件,并且在文件的开始处不包含字节顺序标记(Byte Order Mark, BOM)。
UTF-8 是一种可变长度的 Unicode 字符编码方式,它使用一至四个字节来表示每一个 Unicode 字符。与 UTF-16 或 UTF-32 不同,UTF-8 编码是字节顺序无关的,这意味着它不需要 BOM 来指示字节的排列顺序(大端或小端)。
然而,一些文本编辑器和工具(尤其是 Windows 下的工具)可能会在保存 UTF-8 编码的文件时默认添加一个 BOM(通常是 EF BB BF 这三个字节)。尽管BOM 对于 UTF-8 编码的文件来说是可选的,并且不会改变 UTF-8 文本的解析方式,但在某些情况下,BOM 的存在可能会导致问题或不一致的行为。
因此,当提到 UTF-8 without BOM 时,我们通常是在说一个以 UTF-8 编码保存的文本文件,该文件不包含额外的 BOM 字节。这样的文件通常被认为是“干净”的 UTF-8 文件,可以在不同的操作系统和文本处理工具之间更可靠地交换。
在Linux中,当提到UTF-8编码的文件时,通常指的是不带字节顺序标记(Byte Order Mark, BOM)的UTF-8编码。
在大多数情况下,Linux系统和应用程序都期望UTF-8文件是不带BOM的。如果你尝试在Linux中打开一个带有BOM的UTF-8文件,有些程序可能会正确处理它(忽略BOM),但也有一些程序可能会因BOM的存在而出现错误或不可预测的行为。
因此,如果你正在Linux环境中处理UTF-8文件,并且希望它们与尽可能多的工具兼容,那么最好确保这些文件是不带BOM的UTF-8编码。如果你有一个带有BOM的UTF-8文件,并希望将其转换为不带BOM的格式,你可以使用文本编辑器、命令行工具(如sed、awk、perl等)或编程语言中的库来删除BOM。
例如,使用sed命令删除UTF-8文件开头的BOM,可以这样做:
这条命令会直接在文件filename.txt中删除第一行开头的EF BB BF这三个字节(即UTF-8 BOM)。注意-i选项会直接修改文件,如果你不希望直接修改文件,可以省略该选项,命令会将结果输出到标准输出(通常是终端)。
如果不带 -i 选项,sed 命令会将处理后的内容输出到标准输出(通常是终端),但不会改变原始文件(原始文件还是UTF-8 BOM)。因此,您需要手动将输出重定向到一个新文件或使用其他方法保存输出。
如果使用 -i 选项,sed 命令会直接修改原始文件,去除开头的 BOM 字符。文件的内容会以 UTF-8 编码(不带 BOM)的形式保存在原始文件中。
如果需要验证文件是否已去除 BOM 并以 UTF-8 编码保存,可以使用文本编辑器、file 命令或其他工具来检查文件的编码和内容。