PHP5中file_get_contents函数获取带BOM的utf-8文件内容时需注意
2014-05-26 22:56
621 查看
PHP5中的file_get_contents函数获取文件内容,实际是按二进制来读取的,所以,当你用file_get_contents去获取一个带BOM的UTF-8文件时,它并不会把UTF-8的BOM去掉,当你把读取的内容当作文本内容来进行一些操作时,可能会发生一些意想不到的结果。这并不能算作一个BUG,因为file_get_contents函数读取文件的时候,是按二进制来读取的,读取到的内容是包含BOM的,而用户操作的时候,想当然的以为读取到的内容是不包含BOM的文本内容(如用记事本打开后看到的内容),因为BOM在编辑软件中是不可见的,只有在十六进制模式下才可以看见,问题也就出在这,实际上是由于“操作不统一”造成的。
当对UTF-8编码的文件进行操作时,如果要把读取的内容当作文本内容来处理,最好先对BOM进行一些处理,这个问题在PHP6中得到了解决(可以设置文本/二进制读取模式),有兴趣的朋友可以自己查找PHP6的手册。
一个较简单的解决方法:
[php] view
plaincopy
<?php
$dataStr = file_get_contents('test.txt');
if (strpos($dataStr, "\xEF\xBB\xBF") === 0) {
$dataStr = substr($dataStr, 3);
}
// 对$dataStr进行操作
?>
或者用正则来处理:
[php] view
plaincopy
<?php
$dataStr = file_get_contents('test.txt');
if (preg_match('/^\xEF\xBB\xBF/', $dataStr)) {
$dataStr = substr($dataStr, 3);
}
// 对$dataStr进行操作
?>
什么是BOM?
BOM是Byte Order Mark的缩写,即字节顺序标记,它是插入到UTF-8,UTF-16或UTF-32编码的Unicode文件开头的特殊标记,用来标识Unicode文件的编码类型。
几种编码对应的BOM:
EF BB BF UTF-8
FE FF UTF-16 (big-endian)
FF FE UTF-16 (little-endian)
00 00 FE FF UTF-32 (big-endian)
FF FE 00 00 UTF-32 (little-endian)
对于UTF-8编码的文件而言,BOM标记是可有可无的,Windows自带的记事本文件在保存为UTF-8编码时,会自动加上BOM,现在一些编辑软件,可以在保存为UTF-8编码时可以选择是否带BOM保存。
对于PHP文件,在使用UTF-8编码时,最好都不要BOM保存。因为当你使用include/require/include_once/require_once这些函数去包含一个带BOM的文件时,你得到的网页,在某些兼容性不是很好的浏览器下,你会发现你的网页的实际显示效果跟预期的有细微的差别。
当对UTF-8编码的文件进行操作时,如果要把读取的内容当作文本内容来处理,最好先对BOM进行一些处理,这个问题在PHP6中得到了解决(可以设置文本/二进制读取模式),有兴趣的朋友可以自己查找PHP6的手册。
一个较简单的解决方法:
[php] view
plaincopy
<?php
$dataStr = file_get_contents('test.txt');
if (strpos($dataStr, "\xEF\xBB\xBF") === 0) {
$dataStr = substr($dataStr, 3);
}
// 对$dataStr进行操作
?>
或者用正则来处理:
[php] view
plaincopy
<?php
$dataStr = file_get_contents('test.txt');
if (preg_match('/^\xEF\xBB\xBF/', $dataStr)) {
$dataStr = substr($dataStr, 3);
}
// 对$dataStr进行操作
?>
什么是BOM?
BOM是Byte Order Mark的缩写,即字节顺序标记,它是插入到UTF-8,UTF-16或UTF-32编码的Unicode文件开头的特殊标记,用来标识Unicode文件的编码类型。
几种编码对应的BOM:
EF BB BF UTF-8
FE FF UTF-16 (big-endian)
FF FE UTF-16 (little-endian)
00 00 FE FF UTF-32 (big-endian)
FF FE 00 00 UTF-32 (little-endian)
对于UTF-8编码的文件而言,BOM标记是可有可无的,Windows自带的记事本文件在保存为UTF-8编码时,会自动加上BOM,现在一些编辑软件,可以在保存为UTF-8编码时可以选择是否带BOM保存。
对于PHP文件,在使用UTF-8编码时,最好都不要BOM保存。因为当你使用include/require/include_once/require_once这些函数去包含一个带BOM的文件时,你得到的网页,在某些兼容性不是很好的浏览器下,你会发现你的网页的实际显示效果跟预期的有细微的差别。
相关文章推荐
- PHP5中file_get_contents函数获取带BOM的utf-8文件内容时需注意
- php -- PHP5中file_get_contents函数获取带BOM的utf-8文件内容
- PHP中file_get_contents函数获取带BOM的utf-8,然后json_decode() 返回null的问题
- php中的file_get_contents函数------获取文件内容
- PHP中file_get_contents函数获取带BOM的utf-8,然后json_decode() 返回null的问题
- PHP中file_get_contents函数获取带BOM的utf-8,然后json_decode() 返回null的问题
- 获取Exe文件版本信息的函数(使用GetFileVersionInfo得到TFileVersionInfo结构体,包含12项内容)
- file_get_contents是打工文件或URL获取内容的方法,比其稳定的还有curl_get_contents
- ASP 获取文件扩展名函数getFileExt()
- 利用WinAPI(GetFileVersionInfo)获取文件版本信息
- PHP学习笔记,curl,file_get_content,include和fopen四种方法获取远程文件速度测试.
- file_get_contents获取不到网页内容的解决方法
- GetModuleFileName 获取当前程序可执行文件所在目录
- 抓取网页内容,用file_get_contents函数
- 关于php服务器代理上网的时候使用file_get_contents函数取不到内容的问题的解决方案
- [置顶] 分享:sp_get_object_denifiction_to_file 获取存储过程函数的定义语句并生成文件
- file_get_contents获取远程网页内容函数
- file_get_contents获取不到网页内容的解决方法
- 文件磁盘相关函数[11]-获取指定文件的版本号 GetFileVersion
- 当file_get_contents获取不到网页内容时,以下方法可使用