在编写或者修改用UTF-8编码保存的PHP文件时,有时会莫名其妙出现一些问题:

1. 页面显示一个“锘”字,其他一片空白;

2. 不能登入或者不能登出;

3. 页顶出现一条空白;

4. 页顶出现错误警告;

5. 其它不正常的情况;

6. 生成的图片浏览器无法识别。

分析原因:

文件以UTF-8编码保存时,有两种情情况:带Unicode签名(BOM)和不带Unicode签名。BOM信息是文件开头的一串隐藏的字符,用于让某些编辑器识别这是个UTF-8编码的文件。

类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM——Byte Order Mark)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于一般的文件,这样并不会产生什么麻烦。

但对于 PHP来说,PHP在设计时就没有考虑BOM的问题,不会忽略UTF-8编码的文件开头BOM的那三个字符,会把BOM作为该文件开头正文的一部分。由于必须在<?或者 <?php后面的代码才会作为PHP代码执行,所以将会造成在页面上输出这三个字符,显示效果就要看浏览器了,一般是一个空行或是一个乱码。由于在html一开头有这3个字符的存在,即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部。由于受COOKIE送出机制的限制,在这些文件开头已经有BOM的文件中,COOKIE无法送出(因为在 COOKIE送出前PHP已经送出了文件头),所以登入和登出功能失效。一切依赖COOKIE、SESSION实现的功能全部无效。

【解决办法】:

在编辑、更改任何文本文件时,请务必使用不会乱加BOM的编辑器。Linux下的编辑器应该都没有这个问题。WINDOWS下,请勿使用记事本等编辑器。推荐的编辑器是:Editplus 2.12版本以上;EmEditor;UltraEdit(需要取消‘添加BOM’的相关选项);Dreamweaver(需要取消‘添加BOM’的相关选项)等。

对于已经添加了BOM的文件,要取消的话,可以用以上编辑器另存一次。(Editplus需要先另存为gb,再另存为UTF-8。)

ultraedit, editplus, notepad四个工具对UTF-8 的支持不相同,下面是对四个工具对UTF-8 支持的总结:

UTF-8 BOM header: 是三个字符: EF BB BF。

1. notepad

notepad 在保存时,选择UTF-8 格式,会在文件头写上BOM header.

2. editplus

文件保存时,选择UTF-8 格式,不会在文件头写上 BOM header.

3. ultraedit

ultraedit 对UTF-8 的支持最为完备。在advanced->configuration中可以    选择文件保存时是否写上BOM header.

4. vi

指的是Linux 下的vim, 如果UTF-8 文件开头有BOM header, 其能够正常显示UTF-8编码,否则,显示为乱码。

还有一些编码转换工具,比如,可以用java 写一个简单的编码转换工具,这些工具是不会增加BOM header的。

附录:

UltreEdit的配置,将选项“保存时对所有UTF-8写入UTF-8文件头标记(BOM)”关闭。即:Write UTF-8 BOM header to ALL UTF-8 files when saved OFF。

不同版本有可能没有,而要把“自动检测utf8”关掉。这样看utf8文件就乱码了。

建议用editplus了。

检测目录下文件是否有BOM程序:

//此文件用于快速测试UTF8编码的文件是不是加了BOM,并可自动移除

//By Bob Shen

$basedir=".";; //修改此行为需要检测的目录,点表示当前目录

$auto=0; //是否自动移除发现的BOM信息。1为是,0为否。

//以下不用改动

if ($dh = opendir($basedir)) {

while (($file = readdir($dh)) !== false) {

if ($file!='.' && $file!='..' && !is_dir($basedir."/".$file)) echo "filename: $file ".checkBOM("$basedir/$file")."
";

}

closedir($dh);

}

function checkBOM ($filename) {

global $auto;

$contents=file_get_contents($filename);

$charset[1]=substr($contents, 0, 1);

$charset[2]=substr($contents, 1, 1);

$charset[3]=substr($contents, 2, 1);

if (ord($charset[1])==239 && ord($charset[2])==187 && ord($charset[3])==191) {

if ($auto==1) {

$rest=substr($contents, 3);

rewrite ($filename, $rest);

return ("BOM found, automatically removed.");

} else {

return ("BOM found.");

}

}

else return ("BOM Not Found.");

}

function rewrite ($filename, $data) {

$filenum=fopen($filename,"w");

flock($filenum,LOCK_EX);

fwrite($filenum,$data);

fclose($filenum);

}

?>

php 签名 bom,PHP与Unicode签名(BOM)相关推荐

  1. php 签名 bom,PHP与Unicode签名(BOM,Byte Order Mark)

    在编写或者修改用UTF-8编码保存的PHP文件时,有时会莫名其妙出现一些问题: 1. 页面显示一个"锘"字,其他一片空白: 2. 不能登入或者不能登出: 3. 页顶出现一条空白: ...

  2. php 签名 bom,PHP教程:Unicode 签名(BOM)问题_php

    被 WordPress 模板的怪异代码空行折腾半天. 因为 Dansion 师兄的驱使,开始 Dreamweaver 征途.不过很少有人关注到,在 Dreamweaver 中使用 utf-8 编码保存 ...

  3. PHP与Unicode签名(BOM)

    在编写或者修改用UTF-8编码保存的PHP文件时,有时会莫名其妙出现一些问题: 1. 页面显示一个"锘"字,其他一片空白: 2. 不能登入或者不能登出: 3. 页顶出现一条空白: ...

  4. UTF-8 与 UTF-8 BOM (UTF-8 不带签名与 UTF-8带签名)

    首先明确一点:UTF-8 BOM与UTF-8带签名指的是同一回事,二者指的是UTF-8的同一格式 UTF-8 BOM中的BOM,全称为Byte order mark. 带BOM(签名)的UTF-8文本 ...

  5. QT乱码总结3.UNICODE有无BOM

    QT乱码总结0.Qt乱码产生因素 https://blog.csdn.net/liujiayu2/article/details/103167953 QT乱码总结1.Unicode 和 UTF-8 h ...

  6. php转换编码去掉bom,UTF-8编码怎么去掉BOM头?

    使用uft8编码或做页面的朋友会碰见过把页面保存时会发现页面是空白的但是页面确实有内容,后会会听说是bom头的问题,那么什么是bom头了,要如何解决因为bom头导致页面空白问题呢,下面我们一起来看看具 ...

  7. php+rsa生成签名sign,PHP 做 RSA 签名 生成订单(支付宝例子)

    /组合签名 $a=time(); $b=substr($a, 1); //生成随机订单号 $orderid= $b.mt_rand(10000,99999); //合作身份者id,以2088开头的16 ...

  8. 手机之家在线签名_选择苹果企业签名的原因有哪些?

    ios开发者在没有苹果开发者账号的情况下,只能够选择苹果签名商进行代签名,但是市场上签名的种类在不断的上新,我们应该怎么进行选择呢? 微导流-苹果ios企业签名|TF签名|内测分发托管|免费APP封装 ...

  9. Android签名机制介绍:生成keystore.签名.查看签名信息等方法

    为什么80%的码农都做不了架构师?>>>    Android独有的安全机制,除了权限机制外,另外一个就是签名机制了.签名机制主要用在以下两个主要场合起到其作用:升级App和权限检查 ...

  10. 带圈汉字 在线生成_手写签名在线生成器-手写签名在线生成器可复制

    签名设计地址:www.mgs2s.com(复制到浏览器打开)工具集成签名设计免费版下载,签名设计免费版在线立即生成,简单简体签名设计免费版.最新方便设计公文签名设计颜色保存分享免费版 1.所以大家最好 ...

最新文章

  1. 阿里提出电商搜索全局排序方法,淘宝无线主搜GMV提升5%
  2. 蓝桥杯java a组_蓝桥杯十一届JavaA组-C++解题
  3. Python循环定时服务功能(相似contrab)
  4. php cdi_使用CDI的InjectionPoint注入配置值
  5. CVE-2016-0143 漏洞分析(2016.4)
  6. sql server management studio性能分析_如何分析一条SQL的性能
  7. Invisor for Mac(媒体文件检查工具)v3.14免激活版
  8. 练习:C#---for循环(整数和、阶乘、楼梯)
  9. 椭圆极点极线性质_圆锥曲线(18)———圆锥曲线题目背后的性质总结(1)
  10. 这首歌,竟然是AI生成的,太狠了...
  11. 【codeforce 219D】 Choosing Capital for Treeland (树形DP)
  12. videojs如何获取请求消息_WEB之基于HTTP协议的几种实时数据获取技术
  13. matlab微积分如何计算器,如何用电脑进行微分计算/如何用科学计算器计算微积分...
  14. Python3+selenium+BaiduAI识别并下载花瓣网高颜值妹子图片
  15. python小学教材全解_小学教材全解三年级下数学
  16. Black-Scholes期权定价公式
  17. 连续变量的全概率和贝叶斯公式_条件概率、全概率公式与贝叶斯公式
  18. ESP32产品系列之智能插座(一),框架及硬件设计
  19. 艾美捷胆固醇肉豆蔻酸酯说明书和相关研究
  20. java关键字this含义_java的关键字this的意义及作用

热门文章

  1. java取窗口句柄_如何获取Java中的所有窗口句柄列表(使用JNA)?
  2. 联想计算机wifi卸载,win10联想笔记本电脑wifi功能消失了怎么办
  3. AHK实现DD驱动按键连发
  4. 单片机原理及应用(c51语言版)(一)
  5. 大白菜U盘启动盘手动去除捆绑第三方赞助软件
  6. linux opengl安装教程,Linux下OpenGL的安装与cmake编译OpenGL程序
  7. caj文件转pdf、QQ文件、微信视频
  8. 手把手教你玩转QQ的原创表情
  9. 张小龙《微信背后的产品观》
  10. Linux安装Nexus3