UTF-8 BOM 可能导致样式错乱的解决方法

使用 utf-8 编码来编写网页的时候, 往往会因为 bom (Byte Order Mark) 的问题,导致网页中经常出现一些不明的空行或者乱码字符。 这些都是因为 utf-8 编码方式对于 bom 不是强制的。因此 utf-8 编码在保存文件的时候,会出现不同的处理方式。比如有的浏览器(FireFox)可以自动过滤掉所有 utf-8 bom , 有的 (IE) 只能过滤掉一次 bom (为什么是一次? 当你出现 Include 多次文件时就会碰上这个问题了)。


使用editplus或其他编辑器删除掉文件中的BOM签名,重新刷新页面,样式正常了。

在这里找到一段关于BOM的说明,也许可以帮助你理解:

在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

Windows就是使用BOM来标记文本文件的编码方式的。

...

UTF-8编码的文件中,BOM占三个字节。如果用记事本把一个文本文件另存为UTF-8编码方式的话,用UE打开这个文件,切换到十六进制编辑状态就可以看到开头的FFFE了。这是个标识UTF-8编码文件的好办法,软件通过BOM来识别这个文件是否是UTF-8编码,很多软件还要求读入的文件必须带BOM。可是,还是有很多软件不能识别BOM。我在研究Firefox的时候就知道,在Firefox早期的版本里,扩展是不能有BOM的,不过Firefox 1.5以后的版本已经开始支持BOM了。现在又发现,PHP也不支持BOM。

PHP在设计时就没有考虑BOM的问题,也就是说他不会忽略UTF-8编码的文件开头BOM的那三个字符。由于必须在<?或者<?php后面的代码才会作为PHP代码执行,所以这三个字符将会直接输出。如果插件的文件有这个问题,将会导致在后台页面里激活或者不激活插件后显示白屏,如果是模版文件有这个问题,将会导致这三个字符直接输出,造成页面上方有一个小空行。国外的英文插件和模版一般都是用的ASCII码的编码方式,不会有BOM,只有国内的插件和模版会由于作者的不知情造成问题。还有,大家修改模版的时候,由于输出页面使用UTF-8编码,那么修改模版的时候如果有加入中文字符的话,必须把文件转成UTF-8编码才能正常显示,这个时候如果所使用的编辑器自动加上了BOM的话,将会造成在页面上输出这三个字符,显示效果就要看浏览器了,一般是一个空行或是一个乱码。

(0)

相关推荐

  • BOM与DOM的区别分析

    BOM与DOM的区别 §DHTML技术各项功能的实现都依赖于使用客户端脚本与浏览器宿主及在宿主中输出的Web页面之间的交互,这种交互是通过对象这个技术手段实现的. §BOM即Browser Object Model浏览器对象模型,是在客户端脚本核心的基础上实现的扩展API,通过该API可以使用脚本访问浏览器窗口及其文档对象的各个方面.BOM从IE3.0/NS3.0开始引入. §在BOM API中,把Web浏览器的各个主要外显特性.Web页面及其标记.内容等都封装成一个个对象,通过这些对象提供的成

  • UTF-8、Unicode 标准化表单、BOM

    在"关于Dreamweaver制作UTF-8编码网页的测试 "中提及的疑惑http://www.cnbruce.com/blog/showlog.asp?cat_id=27&log_id=999 "阿韩"朋友一语解惑:即勾选上"包括 Unicode 签名(BOM)" 为详细了解,以下内容摘自帮助文档: 若要设置文档编码,请使用"默认编码"弹出式菜单. "默认编码"指定在创建新页面时要使用的编码,以及

  • UTF-8编码问题BOM详细介绍

    今天在写php代码的时候,出现一个特郁闷的问题那就是两个一模一样的文件,在IE下显示有一个文件却出显了一个空白行,如地址所示http://www.kuomart.com/blog/my_ex/bom_utf8.htm以上出现空白行的页面是用php的require('t.htm')导入模板输出的,而我的php文件和htm文件都是用的记事本写的,然后保存为utf-8编码的,这样之后就出现了用nodepad保存utf8文件自动添加bom到文件的开始,起先自己测试用nodepad,dw,edplus打开

  • php UTF-8、Unicode和BOM问题

    一.介绍 UTF-8 是一种在web应用中经常使用的一种 Unicode 字符的编码方式,使用 UTF-8 的好处在于它是一种变长的编码方式,对于 ANSII 码编码长度为1个字节,这样的话在传输大量 ASCII 字符集的网页时,可以大量节约网络带宽. UTF-8签名(UTF-8 signature)也叫做BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记.BOM,是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是FF FE,变成UTF-8就成了EF

  • 批量去除PHP文件中bom的PHP代码

    需要去除BOM,就把附件里的tool.php文件放到目标目录,然后在浏览器访问tool.php即可! 复制代码 代码如下: <?php //此文件用于快速测试UTF8编码的文件是不是加了BOM,并可自动移除 $basedir="."; //修改此行为需要检测的目录,点表示当前目录 $auto=1; //是否自动移除发现的BOM信息.1为是,0为否. //以下不用改动 if ($dh = opendir($basedir)) { while (($file = readdir($d

  • 检查php文件中是否含有bom的函数

    复制代码 代码如下: <?php /*检测并清除BOM*/ if(isset($_GET['dir'])){ $basedir=$_GET['dir']; }else{ $basedir = '.'; } $auto = 1; checkdir($basedir); function checkdir($basedir){ if($dh = opendir($basedir)){ while(($file = readdir($dh)) !== false){ if($file != '.' &am

  • UTF-8 编码中BOM的检测与删除

    注:Unicode相关知识的详细介绍请参考UTF-8, UTF-16, UTF-32 & BOM. 对于UTF-8/16/32而言,它们名字中的8/16/32指的是编码单位是多少位的,也就是说,它们的编码单位分别是8/16/32位,换算成字节就是1/2/4字节,如果是多字节,就要牵扯到字节序,UTF-8以单字节为编码单位,所以不存在字节序. UTF-8主要的优点是可以兼容ASCII,但如果使用BOM的话,这个好处就荡然无存了,除此以外,BOM的存在还可能引发一些问题,比如下面错误便都有可能是BO

  • UTF-8 BOM 可能导致样式错乱的解决方法

    使用 utf-8 编码来编写网页的时候, 往往会因为 bom (Byte Order Mark) 的问题,导致网页中经常出现一些不明的空行或者乱码字符. 这些都是因为 utf-8 编码方式对于 bom 不是强制的.因此 utf-8 编码在保存文件的时候,会出现不同的处理方式.比如有的浏览器(FireFox)可以自动过滤掉所有 utf-8 bom , 有的 (IE) 只能过滤掉一次 bom (为什么是一次? 当你出现 Include 多次文件时就会碰上这个问题了). 使用editplus或其他编辑

  • vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)

    对于vue-video-player,从github上找到一段代码,直接放页面!可以了,视频展示出来了!开始下一个功能.... 这可能是大部分前端开发者一贯的思维模式,拿来一个插件,看着demo就做出来了,功能展示正常就OK了,但是一旦出了bug,就会面向百度编程或者面向Google编程! 其实,我也是这样的,哈哈哈哈..... 废话不多说,最近在做一个视频播放的功能,找到vue-video-player插件后,咔咔咔完事,拿着我的爱疯,完美演绎!但是其他人的国产某牌手机,展示的完全不一样,打开

  • vue 返回上一页,页面样式错乱的解决

    vue项目,返回上一个,页面样式错乱,就是页面之间的样式干扰了,虽然vue 是单页面开发,但是如果不注意样式并不是说写在哪个页面上就是哪个页面的样式,想要页面样式不冲突,一定要在最外面添加class或者id用来区分 以上这篇vue 返回上一页,页面样式错乱的解决就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Python提示[Errno 32]Broken pipe导致线程crash错误解决方法

    本文实例讲述了Python提示[Errno 32]Broken pipe导致线程crash错误解决方法.分享给大家供大家参考.具体方法如下: 1. 错误现象 ThreadingHTTPServer 实现的 http 服务,如果客户端在服务器返回前,主动断开连接,则服务器端会报 [Errno 32] Broken pipe 错,并导致处理线程 crash. 下面先看个例子,python 版本: 2.7 示例代码 复制代码 代码如下: #!/usr/bin/env python #!coding=u

  • Spring中异步注解@Async的使用、原理及使用时可能导致的问题及解决方法

    前言 其实最近都在研究事务相关的内容,之所以写这么一篇文章是因为前面写了一篇关于循环依赖的文章: <Spring循环依赖的解决办法,你真的懂了吗> 然后,很多同学碰到了下面这个问题,添加了Spring提供的一个异步注解@Async循环依赖无法被解决了,下面是一些读者的留言跟群里同学碰到的问题: 本着讲一个知识点就要讲明白.讲透彻的原则,我决定单独写一篇这样的文章对@Async这个注解做一下详细的介绍,这个注解带来的问题远远不止循环依赖这么简单,如果对它不够熟悉的话建议慎用. 文章要点 @Asy

  • Fabric.js 样式不更新解决方法案例

    目录 本文简介 是否需要重新绘制 代码仓库 本文简介 不知道你有没有遇到过在使用 Fabric.js 时无意中一些骚操作修改了元素的样式,但刷新画布却没更新元素样式? 如果你也遇到同样的问题的话,可以尝试使用本文的方法. 是否需要重新绘制 我先举个例子. <canvas id="c" style="border: 1px solid #ccc;"></canvas> <script> let canvas = new fabric

  • MySQL中配置文件my.cnf因权限问题导致无法启动的解决方法

    本文主要给大家介绍了关于MySQL中配置文件my.cnf因权限问题导致无法启动的相关解决过程,分享出来供大家参考学习,下面来一起看看详细的介绍: 问题描述 MySQL 无法启动,报如下错误: 问题分析 查看 MySQL 错误日志发现如下错误(提示 MySQL 库的 host 表无法打开): 查看 /etc/my.cnf 配置文件: 到 MySQL 数据库所在目录查看表是否存在: 发现 MySQL 库的 host 表是存在的,那为什么会提示不存在呢? 问题应该出在 /etc/my.cnf 文件上,

  • Win2008中SqlServer2008 无法打开错误日志文件导致无法启动的解决方法

    今天早上一个客户的SqlServer 2008的服务器应为重新修改配置导致网站打不开,链接到远程服务器之后,在服务器的事件查看器,发现如下错误, 错误描述: 日志名称: Application 来源: MSSQLSERVER 日期: 2011/10/25 11:30:49 事件 ID: 17058 任务类别: 服务器 级别: 错误 关键字: 经典 用户: 暂缺 计算机: WIN-VPS-SERVER 描述: initerrlog: 无法打开错误日志文件 'D:\WWW\Services\SQLD

  • 故障的机器修好后重启,狂拉主库binlog,导致网络问题的解决方法

    问题简述: 一周前,有一台mysql服务器发生硬件故障,停机了.我们给专门负责这块的同学提交了申请,他们负责去报修这台服务器.今天这台服务器修好后,他们将其开机启动.服务器上的4个mysql实例在开机后自动启动,开始拉主库的binlog.由于这台服务器停机时间比较久,日志丢的比较多,狂拉主库的binlog,导致主库网络出现问题. 现象: 首先,我们完全没有意识到是因为一台坏掉的服务器重启拉主库binlog导致的,因为我们压根不知道 这台服务器什么情况,只知道1周前,我们报修了1台服务器.具体什么

  • sql 2005不允许进行远程连接可能会导致此失败的解决方法

    (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接) 网站的数据库连接语句为:Server=127.0.0.1;uid=sa;pwd=xxx;database=xxx 经测试把server=127.0.0.1改为"server=."或"server=机器名",都可以正常连接: 所以只有在用IP时不能连接,经分析,解决方法如下: 1.打开Sql Server 2005 "配置工具" 中的&qu

随机推荐