微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php UTF8 文件的签名问题

也就是 有BOM 格式编码,或者 无BOM格式编码。
如果看文件内容,是看不出任何差别的,以下列文件(schema.sqlite.sql内容为例:
schema.sqlite.sql
<div class="codetitle"><a style="CURSOR: pointer" data="42214" class="copybut" id="copybut42214" onclick="doCopy('code42214')"> 代码如下:

<div class="codebody" id="code42214">
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
<div class="codetitle"><a style="CURSOR: pointer" data="33928" class="copybut" id="copybut33928" onclick="doCopy('code33928')"> 代码如下:
<div class="codebody" id="code33928">
$schemasql = file_get_contents(dirname(FILE) . '/schema.sqlite.sql');
$dbAdapter->getConnection()->exec($schemasql);

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

原文地址:https://www.jb51.cc/php/28963.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐