使用SSI功能时,GB2312转换成UTF-8的注意事项
最近进行一个项目,为了便于静态页面的维护,利用Apache的SSI功能把多个页面相同的内容提取到一个页面上,然后Include需要页面上。文件的开始采用的编码是GB2312,但是由于应用了AJAX而其默认编码是UTF-8等原因,需要把页面编码GB2312转换成UTF-8。
GB2312字符集是在ASCII字符集上派生的,而此类字符集统称为ANSI字符集。所以GB2312编码文件在记事本中对应的编码是ANSI。由于Win中记事本中存在GB2312和UTF-8两种方式,所以我就直接用记事本直接打开需要的文件,另存为时编码修改为UTF-8。具体方式如下:
- 用记事本打开要转换的网页文件。可以在网页文件中右键选择“打开方式”为记事本,也可以先打开记事本然后把文件拉入记事本。
- 选择“文件”-》“另存为”,在出现的窗口中设置编码为UTF-8:

利用上面的文件转换网页编码之后,我发现在IE下页面不同的地方都出现了空白字符,严重的影响了页面的布局,Firefox和Opera没有问题。但是在记事本和Dreamweaver中,发现不了空白字符的位置,即使把页面所有的空白字符都去掉也解决不了问题。后来发现Editplus也可以转化编码,具体方法是:
- 打开Editplus,选择“文件”-》“打开”
- 在弹出的窗口中选择“转换”方式为“UTF-8”

利用Editplus转换编码的时候有一个好处就是可以多个文件同时转换,就是在打开对话框中选择多个转换文件,同时每个转换的文件都保存了备份文件。不好的地方就是,转换过程中汉字都变成了乱码,这个可能是Editplus没有中文版,只有汉化版,没有考虑中文情况而导致的。
我再次利用Editplus转换一下已经用记事本转换过的页面,页面的空白符问题就得以解决。
后来测试:
- 经过apache解析后的整个GB2312网页文件利用记事本转换成UTF-8就不会出现空白符问题。
- 把出现空白符的整个页面一起用Editplus转换时,出现空白符的地方出现?号,我发现出现空白符的地方就是Include文件的地方。
查找资料如下:
当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。软件一般采用三种方式来决定文本的字符集和编码:
检测文件头标识,提示用户选择,根据一定的规则猜测
最标准的途径是检测文本最开头的几个字节,开头字节 Charset/encoding,如下表:
EF BB BF UTF-8 FE FF UTF-16/UCS-2, little endian FF FE UTF-16/UCS-2, big endian FF FE 00 00 UTF-32/UCS-4, little endian. 00 00 FE FF UTF-32/UCS-4, big-endian.
所以我猜想,应该是利用记事本转换编码的时候,记事本改变了每个文件的头部几个字节的声明,当用SSI包含这些文件的时候,位于文件中间的这些声明字节应该被忽略,但是IE浏览器无法忽略,而当作空白符,所以出现了问题。而当用Editplus来转换的时候,可能声明的字节写法更加规范或者紧凑,IE可以辨认忽略了。
所以编码转换建议如下:
- 英文的直接用Editplus批量转换。
- 中文的,先用记事本转换一下,然后再用Editplus批量转换一下。
- [1]http://www.zeali.net/entry/152
- [2]http://ellisonzeng.spaces.live.com/blog/cns!1198A97487162C2A!161.entry

utf-8 编码以及其他的 utf 编码在存储的时候有一个 BOM 标记,
应该就是这个影响到了页面的正常显示。
到现在为止,我用过的最好用的编码转换软件是 emeditor。
如果在 win32 环境下使用,强烈推荐。