我已阅读到在文本文件的开头添加UTF-8字节顺序标记(3个字符)使其成为UTF-8文件,但我也阅读了unicode建议不要将BOM用于UTF -8。
我正在用PHP生成文件,并且我要求文件必须为UTF-8。我已将UTF-8 BOM添加到文件的开头,但是我从正在解析文件的公司那里收到有关文件开头的垃圾字符的反馈,这给了我要求将文件制作为UTF- 8。
如果我在记事本中打开文件,则该文件不显示BOM表;如果另存为,则显示UTF-8作为默认选项。
在Textpad32中打开文件会在文件开头显示3个字符。
那么什么使文件成为UTF-8?
答案 0 :(得分:6)
文本为UTF-8,因为它与UTF-8一样有效,并且作者认为是。
作者的决定如何传达给消费者是一个不同的问题,涉及约定,猜测以及带内或带外信令的各种方案,例如HTTP或HTML字符集,BOM(可以增强猜测能力),一些信封/嵌入格式,其他数据流,文件命名等等。
答案 1 :(得分:1)
该文件不需要任何明确的指示符,表明它是UTF-8,现代文本编辑器应该从上下文中检测UTF-8编码,因为UTF-8序列非常不同。
此外,正如您自己体验到的那样,PHP不喜欢BOM表头,这是一个愚蠢的事情,常常使脚本输出混乱,并产生了许多无法解决的问题。
HTML有自己的声明文件编码的方式,您可以在HTML本身内完成它:
<head>
<meta charset="UTF-8">
</head>
或在HTTP标头中声明编码,此处使用PHP:
header('Content-Type: text/html; charset=utf-8');
如果未指定,则现代浏览器还将假定UTF-8为默认编码。毕竟这是网络的标准。
答案 2 :(得分:0)
UTF-8是一种特殊的编码。所有7位ASCII文件也都是有效的UTF-8,它也可以编码每个Unicode字符。
您通常会得到建议,将其另存为UTF-8,而无需BOM。实际上,采用传统编码的文件(例如代码页1252,Big5或Shift-JIS)不太可能只是看起来像有效的UTF-8,除非它是故意含糊的测试用例。实际上,许多程序(例如Web浏览器)都可以很好地弄清文件何时为UTF-8。除非为了与上个世纪兼容而被迫默认为其他格式,否则大多数最新软件都将UTF-8作为其首选的文本编码。 (例如,LaTeX在2018年4月将其默认源编码更改为UTF-8,而LuaLaTeX和XeLaTeX引擎多年来一直在这样做。)
有些文档类型有特殊要求。例如,理论上网页的默认编码是Windows 1252,尽管现实世界中的浏览器将尽其所能。 Web上当前的最佳实践是在没有BOM的情况下另存为UTF-8。相反,您可以在文档的<head>
或<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
内编写文档<meta charset="utf-8"/>
或mypy
。这样可以清楚地告诉用户代理字符编码是什么。
另一方面,某些旧版本的软件如果看到BOM就会中断,或者如果存在BOM则仅 可识别UTF-8。微软对此特别感到内especially,其软件不想破坏以前可以正常使用的任何文件,因此,直到今天,我将C源文件另存为带有BOM的UTF-8。这是唯一可以在我使用的每个编译器上使用的格式:即使您没有给它BOM或正确的命令行标志,即使是最新版本的MSVC也可能会猜错,而Clang仅支持UTF-8并且具有没有选择读取任何其他编码的文件。除非曾经存在BOM,否则我曾经被迫使用的某些旧版本的MSVC根本无法理解UTF-8,并且无法提供任何方式来覆盖其自动检测功能。