什么是BOM(Byte Order Mark)?

本文详细介绍了BOM(Byte Order Mark)的概念及其在不同字符编码格式中的表现形式。BOM是一种特殊的标记,用于指示文本文件所使用的Unicode编码方式。文章提供了包括UTF-8、UTF-16等常见编码格式的BOM示例。

BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码,但它对于文件的读者来说是不可见字符。

下表列出不同的字符编码的BOM


编码BOM (十六进制)BOM (十进制)CP1252 字符
UTF-8[t 1]EF BB BF239 187 191
UTF-16 (BE)FE FF254 255þÿ
UTF-16 (LE)FF FE255 254ÿþ
UTF-32 (BE)00 00 FE FF0 0 254 255␀␀þÿ (␀ refers to the ASCII null character)
UTF-32 (LE)FF FE 00 00255 254 0 0ÿþ␀␀ (␀ refers to the ASCII null character)
UTF-7[t 1]2B 2F 76 38
2B 2F 76 39
2B 2F 76 2B
2B 2F 76 2F[t 2]
2B 2F 76 38 2D[t 3]
43 47 118 56
43 47 118 57
43 47 118 43
43 47 118 47
43 47 118 56 45
+/v8
+/v9
+/v+
+/v/
+/v8-
UTF-1[t 1]F7 64 4C247 100 76÷dL
UTF-EBCDIC[t 1]DD 73 66 73221 115 102 115Ýsfs
SCSU[t 1]0E FE FF[t 4]14 254 255␎þÿ (␎ represents the ASCII “shift out” character)
BOCU-1[t 1]FB EE 28251 238 40ûî(
GB-18030[t 1]84 31 95 33132 49 149 51„1•3


参考:http://en.wikipedia.org/wiki/Byte_order_mark

`BOM` 是 **Byte Order Mark(字节顺序标记)** 的缩写,它是一个特殊的 Unicode 字符(码点为 `U+FEFF`),用于标识文本的编码格式和字节顺序。 --- ## 🔍 BOM 是什么参数? BOM 本质上是一组特定的字节序列,通常出现在文本文件或数据流的开头。不同的编码方式有不同的 BOM 字节表示: | 编码类型 | BOM 字节(十六进制) | 字符串表示 | |----------|----------------------|-------------| | UTF-8 | `EF BB BF` | `\xEF\xBB\xBF` | | UTF-16LE | `FF FE` | `\xFF\xFE` | | UTF-16BE | `FE FF` | `\xFE\xFF` | | UTF-32LE | `FF FE 00 00` | `\xFF\xFE\x00\x00` | | UTF-32BE | `00 00 FE FF` | `\x00\x00\xFE\xFF` | > 注意:UTF-8 虽然没有“字节顺序”的问题,但有些编辑器仍会在 UTF-8 文件中插入 BOM 来标识其为 UTF-8。 --- ## 🧠 BOM 的作用 ### ✅ 1. 标识编码格式 BOM 最主要的作用是告诉程序:“我这个文件是用哪种编码保存的”,例如: - 如果你看到 `EF BB BF`,说明这是 UTF-8; - 如果看到 `FF FE`,说明是 UTF-16LE; - 如果看到 `FE FF`,说明是 UTF-16BE。 这在解析文本时非常关键,因为不同编码下同样的字节可能代表完全不同的字符。 --- ### ✅ 2. 解决字节顺序问题(适用于 UTF-16 和 UTF-32) UTF-16 和 UTF-32 是以两个或四个字节表示一个字符的,这就涉及到 **字节顺序(Endianness)** 的问题: - Little Endian(小端):低位在前,高位在后; - Big Endian(大端):高位在前,低位在后; 通过 BOM 可以明确地告诉程序:你的字节顺序应该是怎样的。 --- ### ✅ 3. 避免乱码 如果没有 BOM,程序可能会错误地猜测编码方式,从而导致显示乱码。例如: - 一个 UTF-16LE 文本被当作 ASCII 或 UTF-8 解析,会出现大量乱码字符; - 使用正确的 BOM 可以避免这类问题。 --- ## 💡 实际应用场景 | 场景 | 是否推荐使用 BOM | |------|------------------| | Windows 系统下的文本文件 | ✅ 推荐,很多编辑器默认添加 | | JSON、XML 等结构化数据文件 | ❌ 不推荐,可能导致解析失败 | | 网络传输、API 响应 | ❌ 不推荐,容易破坏格式 | | 日志文件、脚本文件 | ❌ 不推荐,某些解释器会出错 | --- ## 📌 示例代码:检测 BOM(C++) ```cpp std::string detect_bom(const std::string &data) { if (data.size() >= 3 && static_cast<unsigned char>(data[0]) == 0xEF && static_cast<unsigned char>(data[1]) == 0xBB && static_cast<unsigned char>(data[2]) == 0xBF) { return "UTF-8"; } else if (data.size() >= 2) { unsigned char b0 = data[0]; unsigned char b1 = data[1]; if (b0 == 0xFF && b1 == 0xFE) return "UTF-16LE"; if (b0 == 0xFE && b1 == 0xFF) return "UTF-16BE"; } return "Unknown encoding or no BOM"; } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值