网页中的编码与乱码(4)--BOM编码

深入介绍了 html 页面使用 BOM 编码的情况, 它的优先级为什么最高以及具体的静态页面和动态响应的测试示例.

这一篇将介绍 BOM 在 html 页面编码中的运用. 在最前面曾提到, 它的优先级实际上是最高的, 在这里, 将具体介绍什么是 BOM, 还会解析为什么它的优先级最高, 然后还会构建一些具体的测试来验证这一点.

什么是 BOM?

关于什么是 BOM, 在这篇文章中有详细的介绍:

字符集与编码(七)--BOM

这里也稍微啰嗦几句, 内容也基本出自上述文章: BOM=Byte Order Mark, 翻译过来就是"字节顺序标识".

具体则分为两种: 小端序(Little endian)大端序(Big endian).

我们知道, 在记事本中 "另存为" 时可以选择编码, 有以下几种:

记事本 另存为 编码选择

这里的 Unicode 实际就是 UTF-16(小端序).

注: Java 平台中 UTF-16 缺省为 大端序, 与 Windows 恰好相反.

另: 记事本的 UTF-8 默认是带 BOM 的, 而多数 IDE 的编辑器 UTF-8 默认不带 BOM.

继续阅读

字符集与编码(七)--BOM

摘要: 本文讨论了 Unicode 中的 BOM 及与 BOM 紧密相关的端法(endian)问题.

在前一篇的最后, 留下了一个问题, 即 string.getBytes("UTF-16") 会在开头多出两个字节 FEFF 来, Unicode 中称之为 BOM, 接下来就让我们一起来了解有关 BOM 的知识, 在此之前我们需要说说有关 端法 的知识.

什么是端法(endian)?

在具体介绍它之前, 让我们先看看鸡蛋的两种摆法:

鸡蛋的两种摆法

大家看出区别来了吗?

  • 上面的一排都是尖的一端(或者说 小端)向着左, 较圆的一端(或者说 大端)向着右;
  • 而下面一排正好相反.

画得不咋的, 大家凑合看就是了, 画出了<<蒙娜丽莎>>(Mona Lisa)的达芬奇(Leonardo da Vinci)据说开始学画画时也画过一段时间鸡蛋呢, 有说画了几天的, 也有说画了几年!

如果按照我们从左到右的习惯认为左是前面, 上面可以说是 小端在前, 而下面的则是 大端在前. 有人可能要问, 这与我们的 BOM 有何关系? 我们知道 UTF-16 一个代码单元有两个字节, 如果把一代码单元比作一个鸡蛋, 那么它也有两个端, 一个字节是小端, 另一个则是大端.

继续阅读