【发布时间】:2012-10-14 22:38:58
【问题描述】:
我需要提供一个纯文本文件供下载。文本文件需要进行 UTF-8 编码,并且需要存在 BOM。我将我的 php 文件保存为没有 BOM 的 UTF-8 并发送以下标头:
header('HTTP/1.1 200 OK');
header('Content-Type: text/plain; charset=utf-8');
header('Content-Disposition: attachment; filename="test.txt"');
我在没有 BOM 的情况下保存脚本,因为它会干扰发送标头。 所以我尝试通过以下方式手动放置 BOM:
echo chr(239).chr(187).chr(191);
然后我发布了我的文字。如果没有手动 BOM,像 Notepad++ 这样的编辑器将识别文件是 ANSI 编码的,使用假定的手动 BOM,它将被识别为 UTF-8,但将包含字符:

一开始。所以我假设通过启发式方法检测到它是 UTF-8 并且我的手动 BOM 是错误的。
我该怎么做?
编辑:按要求提供 HEX 内容。我只是将文本设为“一些文本”,然后我得到:
C3 AF C2 BB C2 BF 53 4F 4D 45 20 54 45 58 54
将“SOME TEXT”另存为带有 BOM 的 UTF-8:
EF BB BF 53 4F 4D 45 20 54 45 58 54
【问题讨论】:
-
为什么要 BOM,如果文件不能识别为 UTF-8(没有 BOM),那是因为内容不是 UTF-8。
-
听起来经过充分研究和测试。但请显示生成的文本文件的十六进制转储。请也将输出保存到文件托管程序。您是否在不同的编辑器中查看过该文件?您是否也能获得普通浏览器输出(无 Content-Disposition 标头)的效果?
-
@mario 我添加了您要求的 hexdump。我得到相同的结果“SOME TEXT”,但没有 Content-Disposition 标头 - 例如在 Firefox 中的输出。
-
是的,这是一个 UTF-8 编码的 BOM。所以有些东西将
EF保存为C3 AF,将BB保存为C2 BB,将BF保存为C2 BF。我的赌注仍然在编辑器上。 -
@mario 怎么样? EF BB BF 来自 echo chr(239).chr(187).chr(191);那么怎么可能是关于编辑的呢?如果有人要责备它,那一定是浏览器。我会检查...
标签: php utf-8 byte-order-mark