2008年12月21日星期日

UTF-8 BOM与PHP

昨晚写代码的时候,遇到了超级诡异的问题,无论程序怎么改,都提示头信息已经发出。今天下午的时候发现,新建文件,把代码原封不动复制过去,程序居然能够正常运行!接着和Unreal君讨论了一下,Unreal君表示他也曾碰到一样的问题,后来使用了UTF-8 no BOM之后就搞定了。

然后我就查了一下相关资料。原来UTF-8 no BOM与UTF-8 BOM之间的区别是文件开始处的三个字节!这彻底颠覆了我对文本文件的理解。这是我第一次发现文本文件居然还有这种文件头部!

cat -v就看到了前面的三个非打印字符。

$ cat -v admin.php
M-oM-;M-?<?php

然后我又用hexdump看了一下:

$ hexdump admin.php
0000000 bbef 3cbf 703f 7068 2f0a 722f 7165 6975
0000010 6572 6f5f 636e 2865 6627 6e75 7463 6f69

红色部分的其中三个字节就是UTF-8的BOM(Byte Order Maker,字节序列标记)。因为x86属于big edian,所以,字节序列是倒的,正常顺序是:efbbbf。

然后又发现,原来这个问题已经非常有历史了:http://bugs.php.net/bug.php?id=22108。

至此,问题解决。

p.s. 写代码,Linux用着真是非常顺手。 :)

没有评论:

发表评论