最近开始做PHP。今天从txt文件中读取一个中文字符串,跟一个字符串作比较,老是匹配失败,开始以为是编码问题,因为我的PHP文件编码是utf-8,遂将txt文件的编码也改成utf-8,好,噩梦来了...
我将读到的字符串原样输出,完全没有问题,跟预期的一模一样,可是一做字符串比较就比较失败。我读到的字符串是$str = '帐号',但是当我做if($str == '帐号')的时候返回的总是false。
于是我尝试将读到的字符串长度用mb_strlen($str, ‘utf-8’)打出来,神奇啊!我明明输入的是两个字符,可打出来居然有3个字符!我左看右看上看下看就是找不到多出来的字符。。。
然后我用$str = str_replace('帐号', '', $str);再将$str打出来,结果为空,但所占的字符长度却是1,完全不知道这个是什么
最后我用echo urlencode($str);打出来,罪魁祸首出现了!得到的值是%EF%BB%BF!这到底是个什么东东?百度之...
原来,这是BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节, windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的, 然而这个只是微软暗自作的标记, 其它平台上并没有对UTF-8文本文件做个这样的标记。
于是乎,将原来的$str做一个替换,$str = str_replace(urldecode('%EF%BB%BF'), '', $str);搞定!