一、

       BOM:即“Byte Order Mark”的缩写,翻译出来就是字节顺序标记(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的那三个字符。由于必须在
在Bo-Blog的wiki看到,同样使用PHP的Bo-Blog也一样受到BOM的困扰。其中有提到另一个麻烦:“受COOKIE送出机制的限制,在这些文件开头已经有BOM的文件中,COOKIE无法送出(因为在COOKIE送出前PHP已经送出了文件头),所以登入和登出功能失效。一切依赖COOKIE、SESSION实现的功能全部无效。”这个应该就是Wordpress后台出现空白页面的原因了,因为任何一个被执行的文件包含了BOM,这三个字符都将被送出,导致依赖cookies和session的功能失效。

解决的办法嘛,如果只包含英文字符(或者说ASCII编码内的字符),就把文件存成ASCII码方式吧。用UE等编辑器的话,点文件->转换->UTF-8转ASCII,或者在另存为里选择ASCII编码。如果是DOS格式的行尾符,可以用记事本打开,点另存为,选ASCII编码。如果包含中文字符的话,可以用UE的另存为功能,选择“UTF-8 无 BOM”即可。

根据Bo-Blog的wiki的说明:Editplus需要先另存为gb,再另存为UTF-8。不过这样做要小心,所有GBK编码中不包含的字符就会都丢了。如果有一些非中文的字符在文件里的话还是不要用这种办法了。(从这一个小方面来看,UE——UltraEdite-32确实比Editplus好很多,Editplus太轻量级了)

另外我发现了一个办法,就是利用Wordpress提供的文件编辑器。这个办法不受限制,不需要去下载专门的编辑器,毕竟大家都在用Wordpress嘛。先在ftp里把要编辑的文件的写入权限打开,然后进入Wordpress后台->管理->文件编辑器,输入要编辑文件的路径,点编辑文件。在显示出来的编辑界面中,你是看不到开头的那三个字符的,不过没关系,把光标定位在整个文件的第一个字符前,按一下Backspace键。OK了,点更新文件吧,在ftp里刷新一下,可以看到文件小了3字节,大功告成。

最后说一下,这是个大问题,所有要自己写插件的,编辑别人的插件自己用的,需要修改模版的(这条估计每个人都需要吧),最好了解一下上面的知识,免得出现问题时不知所措。

以下内容来源与unicode 官网:

问:什么是BOM?

答:字节顺序标记(BOM)由数据流开头的字符代码U + FEFF组成,它可以用作定义字节顺序和编码形式的签名,主要是未标记的明文文件。在某些更高级别的协议下,在该协议中定义的Unicode数据流中可能必须(或禁止)使用BOM。 [AF]

问:BOM在哪里有用?

答:BOM在输入为文本的文件的开头很有用,但是不知道它们是大端还是小端格式 - 它也可以作为提示指示文件是Unicode,如与遗留编码相反,此外,它充当所使用的特定编码形式的签名。[AF]

问:'endian'是什么意思?

答:长于一个字节的数据类型可以存储在具有最高有效字节(MSB)的第一个或最后一个的计算机存储器中。前者称为big-endian,后者是little-endian。交换数据时,在发送系统上以“正确”顺序出现的字节在接收系统上可能看起来是乱序的。在这种情况下,BOM看起来像0xFFFE,这是一个非特性,允许接收系统在处理数据之前应用字节反转。UTF-8是面向字节的,因此没有这个问题。然而,初始BOM可能有助于将数据流标识为UTF-8。[AF]

问:使用BOM时,是否仅使用16位Unicode文本?

答:不可以,无论Unicode文本如何转换,BOM都可以用作签名:UTF-16,UTF-8或UTF-32。包含BOM的确切字节将是由该转换格式转换为Unicode字符U + FEFF的任何字节。在该表单中,BOM用于指示它是Unicode文件以及它所处的格式。示例:

字节 编码表格
00 00 FE FF UTF-32,big-endian
FF FE 00 00 UTF-32,小端
FE FF UTF-16,big-endian
FF FE UTF-16,小端
EF BB BF UTF-8

问:UTF-8数据流是否包含BOM字符(UTF-8格式)?如果是,那么我仍然可以假设剩余的UTF-8字节是大端序吗?

答:是的,UTF-8可以包含BOM。但是,它对 字节流的字节顺序没有影响。UTF-8始终具有相同的字节顺序。初始BOM 仅用作签名 - 表示未标记的文本文件为UTF-8。请注意,某些UTF-8编码数据的收件人不希望使用BOM。在8位环境中透明地使用UTF-8的地方,使用BOM会干扰任何在开头需要特定ASCII字符的协议或文件格式,例如使用“#!” 在Unix shell脚本的开头。 [AF]

问:在文件中间我应该怎么处理U + FEFF?

答:如果没有支持将其用作BOM的协议,并且不在文本流的开头,则通常不应出现U + FEFF。为了向后兼容,应将其视为零宽度非破坏空间(ZWNBSP),然后将其作为文件或字符串内容的一部分。使用U + 2060 WORD JOINER比ZWNBSP更强烈地表达单词连接语义,因为它不能与BOM混淆。在设计标记语言或数据协议时,U + FEFF的使用可以限制为字节顺序标记的使用。在这种情况下,发生在文件中间的任何U + FEFF都可以视为 不受支持的字符。 [AF]

问:我正在使用在文本开头有BOM的协议。我如何代表最初的ZWNBSP?

答:请使用U + 2060 WORD JOINER。

问:如何标记不将U + FEFF解释为BOM的数据?

答:使用标签UTF-16BE表示big-endian UTF-16文本,使用UTF-16LE表示little-endian UTF-16文本。如果您使用BOM,请将文本标记为UTF-16。 [MD]

问:为什么我不总是使用需要BOM的协议?

答:如果数据具有关联类型,例如数据库中的字段,则不需要BOM。特别是,如果文本数据流标记为UTF-16BE,UTF-16LE,UTF-32BE或UTF-32LE,则既不需要也不允许 BOM 。任何U + FEFF都将被解释为ZWNBSP。

不要使用BOM标记数据库或字段集中的每个字符串,因为它会浪费空间并使字符串连接变得复杂。此外,它还意味着两个数据字段可能具有完全相同的内容,但不是二进制相等的(其中一个数据字段以BOM开头)。

问:我应该如何处理物料清单?

答:以下是一些指导原则:

  1. 特定协议(例如,.txt文件的Microsoft约定)可能需要在某些Unicode数据流(例如文件)上使用BOM。如果需要符合此类协议,请使用BOM。

  2. 某些协议允许在未标记文本的情况下使用可选BOM。在那些情况下,

    • 如果已知文本数据流是纯文本,但编码未知,则可以将BOM用作签名。如果没有BOM,则编码可以是任何内容。

    • 如果已知文本数据流是纯Unicode文本(但不是哪个字节序),那么BOM可以用作签名。如果没有BOM,则应将文本解释为big-endian。

  3. 一些面向字节的协议期望文件开头的ASCII字符。如果UTF-8与这些协议一起使用,则应避免使用BOM作为编码形式签名。

  4. 如果已知数据流的精确类型(例如Unicode big-endian或Unicode little-endian),则不应使用BOM。特别地,每当一个数据流被声明为UTF-16BE,UTF-16LE,UTF-32BE或UTF-32LE一个BOM 必须不能使用。(另请参阅问:UCS-2和UTF-16有什么区别?) [AF]

以下内容来源与网络搜索:

在编程中,我们有时候会使用codecs.iterencode对文件对象进行包装,也即是使用utf8进行编码,接着又使用codecs.iterdecode对编码的包装器进行解码。最后对文件进行遍历并输出。写入文件头里标记不同编码的常量byte order marks (BOMs):

codecs.BOM 

默认的BOM。

codecs.BOM_BE 

大端格式的BOM。

codecs.BOM_LE 

小端格式的BOM。

codecs.BOM_UTF8 

UTF8的BOM。

codecs.BOM_UTF16 

UTF16的BOM。

codecs.BOM_UTF16_BE 

UTF16的大端的BOM。

codecs.BOM_UTF16_LE 

UTF16的小端的BOM。

codecs.BOM_UTF32 

UTF32默认的BOM。

codecs.BOM_UTF32_BE 

UTF32的大端的BOM。

codecs.BOM_UTF32_LE 

UTF32的小端的BOM。

例子:

#python 3.4.3

import codecs

print(codecs.BOM)

print(codecs.BOM_BE)

print(codecs.BOM_LE)

print(codecs.BOM_UTF8)

print(codecs.BOM_UTF16)

print(codecs.BOM_UTF16_BE)

print(codecs.BOM_UTF16_LE)

print(codecs.BOM_UTF32)

print(codecs.BOM_UTF32_BE) 

print(codecs.BOM_UTF32_LE)

结果输出如下:

b'\xff\xfe'

b'\xfe\xff'

b'\xff\xfe'

b'\xef\xbb\xbf'

b'\xff\xfe'

b'\xfe\xff'

b'\xff\xfe'

b'\xff\xfe\x00\x00'

b'\x00\x00\xfe\xff'

b'\xff\xfe\x00\x00'

练习: 

代码如下:

  import os

  import codecs

  filenames=os.listdir(os.getcwd())

  out=file("name.txt","w")

  for filename in filenames:

  out.write(filename.decode("gb2312").encode("utf-8"))

  out.close()

  将执行文件的当前目录及文件名写入到name.txt文件中,以utf-8格式保存

  如果采用ANSI编码保存,用如下代码写入即可:

   代码如下:

  out.write(filename)

  打开文件并写入

  引用codecs模块,对该模块目前不了解。在此记录下方法,有空掌握该模块功能及用法。

  代码如下:

  import codecs

  file=codecs.open("lol.txt","w","utf-8")

  file.write(u"我")

  file.close()

  读取ANSI编码的文本文件和utf-8编码的文件

  读取ANSI编码文件

  建立一个文件test.txt,文件格式用ANSI,内容为:

  代码如下:

  abc中文

  用python来读取

  代码如下:

  # coding=gbk

  print open("Test.txt").read()

  结果:abc中文

  读取utf-8编码文件(无BOM)

  把文件格式改成UTF-8:

  代码如下:

  结果:abc涓 枃

  显然,这里需要解码:

  代码如下:

  # -*- coding: utf-8 -*-

  import codecs

  print open("Test.txt").read().decode("utf-8")

  结果:abc中文

  读取utf-8编码文件(有BOM)

  某些软件在保存一个以UTF-8编码的文件时,默认会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。在有些软件可以控制是否插入BOM。如果在有BOM的情况下,在读取时需要自己去掉这些字符,python中的codecs module定义了这个常量:

  代码如下:

  # -*- coding: utf-8 -*-

  import codecs

  data = open("Test.txt").read()

  if data[:3] == codecs.BOM_UTF8:

  data = data[3:]

  print data.decode("utf-8")

  结果:abc中文

  在看下面的例子:

  代码如下:

  # -*- coding: utf-8 -*-

  data = open("name_utf8.txt").read()

  u=data.decode("utf-8")

  print u[1:]

  打开utf-8格式的文件并读取utf-8字符串后,解码变成unicode对象。但是会把附加的三个字符同样进行转换,变成一个unicode字符。该字符不能被打印。所以为了正常显示,采用u[1:]的方式,过滤到第一个字符。

  注意:在处理unicode中文字符串的时候,必须首先对它调用encode函数,转换成其它编码输出。

  设置python默认编码

  代码如下:

  import sys

  reload(sys)

  sys.setdefaultencoding("utf-8")

  print sys.getdefaultencoding()

  今天碰到了 python 编码问题, 报错信息如下

  代码如下:

  Traceback (most recent call last):

  File "ntpath.pyc", line 108, in join

  UnicodeDecodeError: 'ascii' codec can't decode byte 0xa1 in position 36: ordinal not in range(128)

  显然是当前的编码为ascii, 无法解析0xa1(十进制为161, 超过上限128). 进入python console后, 发现默认编码确实是 ascii, 验证过程为:

  在python2.6中无法调用sys.setdefaultencoding()函数来修改默认编码,因为python在启动的时候会调用site.py文件,在这个文件中设置完默认编码后会删除sys的setdefaultencoding方法。不能再被调用了. 在确定sys已经导入的情况下, 可以reload sys这个模块之后, 再 sys.setdefaultencoding('utf8')

  代码如下:

  import sys

  reload(sys)

  sys.setdefaultencoding("utf-8")

  print sys.getdefaultencoding()

  确实有效, 根据 limodou 讲解, site.py 是 python 解释器启动后, 默认加载的一个脚本. 如果使用 python -S 启动的话, 将不会自动加载 site.py.

  上面写的挺啰嗦的.

  ==================================

  如何永久地将默认编码设置为utf-8呢? 有2种方法:

  ==================================

  第一个方法<不推荐>: 编辑site.py, 修改setencoding()函数, 强制设置为 utf-8

  第二个方法<推荐>: 增加一个名为 sitecustomize.py, 推荐存放的路径为 site-packages 目录下

  sitecustomize.py 是在 site.py 被import 执行的, 因为 sys.setdefaultencoding() 是在 site.py 的最后删除的, 所以, 可以在 sitecustomize.py 使用 sys.setdefaultencoding().

     代码如下:

  import sys

  sys.setdefaultencoding('utf-8')

  既然 sitecustomize.py 能被自动加载, 所以除了设置编码外, 也可以设置一些其他的东西

  字符串的编码

  代码如下:

  s1='中文'

  像上面那样直接输入的字符串是按照代码文件的编码来处理的,如果是unicode编码,有以下三种方式:

  代码如下:

  1 s1 = u'中文'

  2 s2 = unicode('中文','gbk')

  3 s3 = s1.decode('gbk')

  unicode是一个内置函数,第二个参数指示源字符串的编码格式。

  decode是任何字符串具有的方法,将字符串转换成unicode格式,参数指示源字符串的编码格式。

  encode也是任何字符串具有的方法,将字符串转换成参数指定的格式。

unicode官网:https://www.unicode.org

unicode之BOM:http://unicode.org/faq/utf_bom.html

字节顺序标记(BOM)详解相关推荐

  1. 【转】刨根究底字符编码之十一——UTF-8编码方式与字节序标记BOM

    一.UTF-8编码方式 1. 接下来将分别介绍Unicode字符集的三种编码方式:UTF-8.UTF-16.UTF-32.这里先介绍应用最为广泛的UTF-8. 为满足基于ASCII.面向字节的字符处理 ...

  2. 字节顺序标记(ByteOrderMark)BOM

    概述 之前我们整理了大端和小端 和 字符编码 ,知道对于多字节的数据会存在不同机器之间的存储问题.对于整形我们知道可以通过网络字节序进行传输,但是对于不同编码的字符串我们该怎么办呢? 其实字符串就是一 ...

  3. Vim位置标记mark详解

    转载自Vim教程网Vim位置标记mark详解-Vim入门教程(34) Vim的位置标记可以实现在文档中的快速跳转.可以通过命令 mark 或缩写形式 m 手动设置位置标记,Vim也会自动记录某些自身感 ...

  4. FileTracker : error FTK1013: 在以下文件跟踪日志文件中,未能找到 unicode 字节顺序标记: E:\HT-Mobile\cocos2d-project\MobileP

    最近在做项目中遇到了 FileTracker : error FTK1013: 在以下文件跟踪日志文件中,未能找到 unicode 字节顺序标记:  E:\HT-Mobile\cocos2d-proj ...

  5. HTML超文本标记语言详解

    HTML超文本标记语言详解 Hyper Text Markup Language(超文本标记语言) 现在的开发版本一般为HTML5+CSS3 W3C标准:World Wide Web Consorti ...

  6. pythonprint字节按照16进制输出_对python以16进制打印字节数组的方法详解

    对python以16进制打印字节数组的方法详解 一.问题描述 如果直接用print打印bytes的话,有时候会直接显示ascii对应的字符,看起来很蛋疼. 二.运行效果 上面一行是直接用print打印 ...

  7. 数据结构第二课 | 顺序表(详解)

    前言:Hello!大家好,我是@每天都要敲代码,上次我们讲了数据结构第一课时间复杂度和空间复杂度:不明白的小伙伴可以学习一遍时间复杂度和空间复杂度传送门:今天让我们开始一起学习数据结构第二课啦---- ...

  8. 【C】二叉树--顺序结构(详解堆的实现,topK排序、堆排)、和链式结构(链式结构的遍历、链式结构常见递归操作以及练习题)

    本章我们将引入树的概念并详细介绍二叉树.我们会在介绍顺序二叉树基础上,进一步介绍堆以及堆的实现,并以此为依据详解topK排序.堆排等问题:然后我们会介绍链式二叉树的实现以及各种操作.最后,我们也会给出 ...

  9. php中继承过来的类初始化顺序,java_图文详解Java中class的初始化顺序,class的装载 在讲class的初始化 - phpStudy...

    图文详解Java中class的初始化顺序 class的装载 在讲class的初始化之前,我们来讲解下class的装载顺序. 以下摘自<Thinking in Java 4> 由于Java ...

最新文章

  1. 中文ocr识别数据集地址
  2. 【数字信号处理】傅里叶变换性质 ( 傅里叶变换线性性质 | 傅里叶变换时移性质 )
  3. EF架构~单表一对多集合的插入(树型结构)
  4. 记-纯前端excle下载
  5. centos一键清理磁盘空间_如何清理 Docker 占用的磁盘空间
  6. C#的变迁史03 - C# 3.0篇
  7. 20W+喜爱的Pathview网页版 | 整合表达谱数据KEGG通路可视化
  8. 计算机英语讲课笔记05
  9. mac终端配置Android ADB命令
  10. devops handbook 读书笔记_DevOps教程:DevOps 面试题
  11. Axure|【医药、医疗】药企员工内部培训平台原型
  12. CCPC-wannafly Camp Day2 讲课内容总结(杜瑜皓-数据结构)
  13. hadoop--环境搭建--域名解析失败
  14. 在Hyper-V中手动将.avhd合并到.vhd
  15. linu修改open files无效_不越狱修改运动步数,安卓苹果手机通用
  16. ConvNeXt+YOLOv7改进方案
  17. 欢迎访问我的个人网站!
  18. 保护视力台灯是白光还是暖光?盘点专业护眼的暖光护眼台灯
  19. 《权威指南》笔记 -- 8.2 函数调用
  20. 如何接吻 接吻技巧 接吻方法大全

热门文章

  1. 电信运营商云计算战略和发展现状
  2. 2020-12-3 QQ通讯录(不完整内容)
  3. 酒店管理系统功能结构图
  4. 计算机教学研讨会方案,【教学教研】新学年我校计算机专业组积极开展教学研讨会议...
  5. 计算机方向考研大概有哪些专业?这些专业分别会做什么?
  6. 5G支持下,人工智能除了AI换脸,还能干什么?
  7. 千古谏臣教给你的向上管理法
  8. iptables 窥探、扫盲
  9. Java ASCII编码
  10. 关于更换BGA封装的芯片and重新焊接BGA封装的芯片