使用字节顺序标记

始终为 Unicode 纯文本文件添加字节顺序标记的前缀,这会通知接收文件的应用程序该文件是字节排序的。 下表列出了可用的字节顺序标记。 由于 Unicode 纯文本是 16 位代码值的序列,因此它对写入文本时使用的字节顺序很敏感。

注意

字节顺序标记不是用于选择文本字节顺序的控制字符。

 

字节顺序标记 说明
EF BB BF UTF-8
FF FE UTF-16, little endian
FE FF UTF-16,big endian
FF FE 00 00 UTF-32, little endian
00 00 FE FF UTF-32,big-endian

 

注意

Microsoft 使用 UTF-16,即小 endian 字节顺序。

 

理想情况下,所有 Unicode 文本仅遵循一组字节排序规则。 但是,这是不可能的,因为微处理器在最小有效字节的位置上有所不同。 Intel 和 MIPS 处理器首先定位最小有效字节,而摩托罗拉处理器 (,所有字节反转 Unicode 文件) 排在最后位置。 由于只有一组字节排序规则,每次读取或写入纯文本文件时,一种类型的微处理器的用户都被迫交换字节顺序,即使文件从未传输到基于不同微处理器的另一个操作系统。

指定字节顺序的首选位置位于文件标头中,但文本文件没有标头。 因此,Unicode 已将 U+FEFF) (字符和非字符 (U+FFFE) 定义为字节顺序标记。 它们彼此镜像字节图像。

由于序列 U+FEFF 在常规非 Unicode 文本文件的开头非常罕见,因此它可以用作隐式标记或签名,以将文件标识为 Unicode 文件。 同时读取 Unicode 和非 Unicode 文本文件的应用程序应使用此序列的存在作为指示文件很可能是 Unicode 文件的指示符。 将此技术与使用 MS-DOS EOF 标记终止文本文件进行比较。

当应用程序在文本文件的开头找到 U+FEFF 时,它通常会将该文件作为 Unicode 文件进行处理,尽管它可以执行进一步的启发式检查来验证。 此类检查可以像测试一样简单,以确定低阶字节中的变体是否远远高于高阶字节的变体。 例如,如果将 ASCII 文本转换为 Unicode 文本,则每秒字节为 0。 此外,检查换行符和回车符 (U+000A 和 U+000D) 以及偶数或奇数文件大小都可以提供文件性质的强指标。

当应用程序在文本文件的开头找到 U+FFFE 时,它会将其解释为表示该文件是字节反转 Unicode 文件。 应用程序可以交换字节的顺序,也可以提醒用户发生错误。

由于在任何代码页中都找不到 Unicode 字节顺序标记字符,因此如果数据转换为 ANSI,该字符将消失。 与其他 Unicode 字符不同,转换时不会将其替换为默认字符。 如果在文件的中间找到字节顺序标记,则不会将其解释为 Unicode 字符,并且对文本输出没有影响。

注意

Unicode 值 U+FFFF 在纯文本文件中是非法的,不能在应用程序之间传递。 它保留给应用程序的专用使用。

 

在 Unicode 中使用特殊字符