UTF-8和UTF-8与BOM有什么不同?哪个更好?
当前回答
问:UTF-8和没有BOM的UTF-8有什么不同?哪个更好?
以下是一些摘自维基百科关于字节顺序标记(BOM)的文章,我相信这些文章为这个问题提供了一个可靠的答案。
关于BOM和UTF-8的含义:
Unicode标准允许使用UTF-8格式的BOM,但不要求 或推荐使用。字节顺序在UTF-8中没有意义,因此 在UTF-8中唯一使用的是在文本流开始时发出信号 以UTF-8编码。
不使用BOM的参数:
不使用BOM的主要动机是向后兼容性 使用不支持unicode的软件…另一个不这样做的原因 使用BOM是为了鼓励UTF-8作为“默认”编码。
使用BOM的参数:
The argument for using a BOM is that without it, heuristic analysis is required to determine what character encoding a file is using. Historically such analysis, to distinguish various 8-bit encodings, is complicated, error-prone, and sometimes slow. A number of libraries are available to ease the task, such as Mozilla Universal Charset Detector and International Components for Unicode. Programmers mistakenly assume that detection of UTF-8 is equally difficult (it is not because of the vast majority of byte sequences are invalid UTF-8, while the encodings these libraries are trying to distinguish allow all possible byte sequences). Therefore not all Unicode-aware programs perform such an analysis and instead rely on the BOM. In particular, Microsoft compilers and interpreters, and many pieces of software on Microsoft Windows such as Notepad will not correctly read UTF-8 text unless it has only ASCII characters or it starts with the BOM, and will add a BOM to the start when saving text as UTF-8. Google Docs will add a BOM when a Microsoft Word document is downloaded as a plain text file.
有或没有BOM,哪个更好:
IETF建议,如果一个协议(a)总是使用UTF-8, 或者(b)有其他方式表明使用的是什么编码, 那么它“应该禁止使用U+FEFF作为签名。”
我的结论是:
仅在与软件应用程序的兼容性是绝对必要的情况下使用BOM。
还要注意,虽然引用的维基百科文章指出,许多Microsoft应用程序依赖BOM来正确检测UTF-8,但并非所有Microsoft应用程序都是如此。例如,正如@barlop所指出的,当使用带有UTF-8†的Windows命令提示符时,此类类型和更多的命令不期望出现BOM。如果存在BOM,它可能会像其他应用程序一样出现问题。
†chcp命令通过代码页65001提供对UTF-8(没有BOM)的支持。
其他回答
将BOM放在UTF-8编码的文件中至少有三个问题。
不包含文本的文件不再为空,因为它们始终包含BOM。 在UTF-8的ASCII子集中保存文本的文件本身不再是ASCII,因为BOM不是ASCII,这使得一些现有工具无法使用,用户可能不可能替换这些遗留工具。 不可能将几个文件连接在一起,因为现在每个文件开头都有一个BOM。
而且,正如其他人所提到的,使用BOM来检测某些东西是否是UTF-8是既不够也没有必要的:
这是不够的,因为任意字节序列可能恰好以构成BOM的确切序列开始。 这是不必要的,因为你可以像读取UTF-8一样读取字节;如果成功,根据定义,它是有效的UTF-8。
BOM倾向于在某个地方爆炸(没有双关语)。当它突然出现时(例如,无法被浏览器、编辑器等识别),它会以奇怪的字符出现在文档的开头(例如,HTML文件、JSON响应、RSS等),并导致类似于最近奥巴马在Twitter上谈话时经历的编码问题那样的尴尬。
当它出现在难以调试的地方或当测试被忽略时,这是非常令人讨厌的。所以除非必须使用,否则最好避免使用。
引用于维基百科页面底部BOM: http://en.wikipedia.org/wiki/Byte-order_mark#cite_note-2
对于UTF-8,使用BOM既不要求也不推荐,但在从使用BOM的其他编码形式转换UTF-8数据或将BOM用作UTF-8签名的上下文中可能会遇到这种情况。
当您希望显示以UTF-8编码的信息时,可能不会遇到问题。例如,将HTML文档声明为UTF-8,您将在浏览器中显示文档主体中包含的所有内容。
但在Windows或Linux上,当我们有文本、CSV和XML文件时,情况就不同了。
例如,Windows或Linux中的文本文件,这是最简单的事情之一,它(通常)不是UTF-8。
保存为XML并声明为UTF-8:
<?xml version="1.0" encoding="UTF-8"?>
即使声明为UTF-8,它也不能正确显示(不能读取)。
我有一串包含法语字母的数据,需要将其保存为XML以进行联合。无需从一开始就创建UTF-8文件(更改IDE中的选项和“创建新文件”)或在文件开头添加BOM
$file="\xEF\xBB\xBF".$string;
我无法将法语字母保存在XML文件中。
UTF-8与BOM更好地识别。我得出这个结论很不容易。我正在从事一个项目,其中一个结果是一个CSV文件,包括Unicode字符。
如果CSV文件保存时没有BOM, Excel会认为它是ANSI并显示胡言乱语。一旦你在前面添加了“EF BB BF”(例如,通过使用UTF-8记事本重新保存它;或notepad++与UTF-8与BOM), Excel打开它很好。
RFC 3629: "UTF-8,一种ISO 10646的转换格式",2003年11月建议将BOM字符前置到Unicode文本文件中 在https://www.rfc-editor.org/rfc/rfc3629(这最后的信息可以在:http://www.herongyang.com/Unicode/Notepad-Byte-Order-Mark-BOM-FEFF-EFBBBF.html)
推荐文章
- (grep)正则表达式匹配非ascii字符?
- 我如何确定文件编码在OS X?
- Java标识符中的“连接字符”是什么?
- 使用Javascript的atob解码base64不能正确解码utf-8字符串
- 为什么字符集名称不是常量?
- 编码字符串为UTF-8
- 有没有统一码符号来表示"搜索"
- 我如何在PHP中输出一个UTF-8 CSV, Excel将正确读取?
- Python __str__与__unicode__
- 如何在Python中将字符串转换为utf-8
- Unicode和UTF-8的区别是什么?
- 我真的需要将“&”编码为“&”吗?
- 用Python写入UTF-8文件
- c++中的_tmain()和main()有什么区别?
- HTML编码问题-显示“”字符而不是“ ”