php UTF8 文件的签名问题

2015-01-24信息快讯网

在我们保存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 'noemail@test.com', 
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签名,不然再次打开文件时,还是系统的默认编码而已。
使用HMAC-SHA1签名方法详解
rrmdir php中递归删除目录及目录下的文件
PHP与C#分别格式化文件大小的代码
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
php中通过Ajax如何实现异步文件上传的代码实例
PHP 遍历文件实现代码
zend api扩展的php对象的autoload工具
在MongoDB中模拟Auto Increment的php代码
php做下载文件的实现代码及文件名中乱码解决方法
php INI配置文件的解析实现分析
php目录操作函数之获取目录与文件的类型
PHP的autoload自动加载机制使用说明
php iconv() : Detected an illegal character in input string
php+jquery编码方面的一些心得(utf-8 gb2312)
php上传文件的增强函数
PHP生成UTF8文件的方法
PHP MYSQL乱码问题,使用SET NAMES utf8校正
php 远程包含文件漏洞分析第1/6页
PHP+MySQL 手工注入语句大全 推荐
PHP 文件上传源码分析(RFC1867)
PHP 读取和修改大文件的某行内容的代码
php 文件上传系统手记
火车头discuz6.1 完美采集的php接口文件
frename PHP 灵活文件命名函数 frename
用PHP读取flv文件的播放时间长度
PHP 上传文件的方法(类)
PHP UTF8编码内的繁简转换类
UTF8编码内的繁简转换的PHP类
学习discuz php 引入文件的方法DISCUZ_ROOT
php ignore_user_abort与register_shutdown_function 使用方法
PHP 字符串编码截取函数(兼容utf-8和gb2312)
PHP 读取文件的正确方法
php auth_http类库进行身份效验
PHP 截取字符串 分别适合GB2312和UTF8编码情况
PHP5+UTF8多文件上传类
PHP写入WRITE编码为UTF8的文件的实现代码
PHP中动态显示签名和ip原理
©2014-2024 dbsqp.com