当前位置: 首页 > 图文教程 > 网络编程 > PHP > php UTF8 文件的签名问题

PHP
php SQL之where语句生成器
php 随机生成10位字符代码
PHP获取类中常量,属性,及方法列表的方法
php 动态执行带有参数的类方法
php pcntl_fork和pcntl_fork 的用法
PHP Document 代码注释规范
php error_log 函数的使用
PHP 加密与解密的斗争
对squid中refresh_pattern的一些理解和建议
一个php导出oracle库的php代码
PHP 中执行排序与 MySQL 中排序
php 保留小数点
将数组写入txt文件 var_export
php反弹shell实现代码
PHP 危险函数解释 分析
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
Uchome1.2 1.5 代码学习 common.php
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
php mssql 分页SQL语句优化 持续影响
PHP mb_convert_encoding 获取字符串编码类型实现代码

PHP 中的 php UTF8 文件的签名问题


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-10   浏览: 145 ::
收藏到网摘: n/a

在我们保存UTF8文本文件的时候,可以选择带签名,或者不带签名。 也就是 有BOM 格式编码,或者 无BOM格式编码。
如果看文件的内容,是看不出任何差别的,以下列文件(schema.sqlite.sql)内容为例:
schema.sqlite.sql
复制代码 代码如下:

CREATE TABLE guestbook (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
email VARCHAR(32) NOT NULL DEFAULT '[email protected]',
comment TEXT NULL,
created DATETIME NOT NULL
);
CREATE INDEX "id" ON "guestbook" ("id");

如果不带签名,则文件的大小为232字节,如果带签名,则文件大小为235字节。
UTF8签名有3个字节(内容为:EFBBBF),是专门用来告诉软件:该文件是UTF8编码的。
在一般情况下,有无签名不会带来问题,因为编辑器或者其他软件可以按照文本的内容来推断出是否是UTF8。
但有些时候还是会导致问题,比如上诉文件。该文件是sql语句文件,程序恰好要通过以下语句(php)来执行该sql:
复制代码 代码如下:

$schemaSql = file_get_contents(dirname(__FILE__) . '/schema.sqlite.sql');
$dbAdapter->getConnection()->exec($schemaSql);

在这种情况下,带有签名的文件就会导致问题了,因为“UTF8签名用的三个字节”其实是位于文件的最前面。所以导致了上面的语句无法成功运行。
解决的办法也很简单,去掉该文件UTF8签名即可。
当然,上面文件的内容其实都是单字节的,是没有必要保存为UTF8编码的。
补充:全部是单字节内容的文件除非加了UTF8签名,不然再次打开文件时,还是系统的默认编码而已。