PHP:如何以带有BOM的UTF-8发布文本/纯文本内容?

C.O*_*.O. 5 php byte-order-mark utf-8

我需要提供一个纯文本文件供下载.文本文件需要采用UTF-8编码,并且需要存在BOM.我将我的php文件保存为UTF-8而没有BOM,并发送以下标题:

header('HTTP/1.1 200 OK');
header('Content-Type: text/plain; charset=utf-8');
header('Content-Disposition: attachment; filename="test.txt"');
Run Code Online (Sandbox Code Playgroud)

我保存脚本没有BOM,因为它会干扰发送标题.所以我尝试通过以下方式手动放置BOM:

echo chr(239).chr(187).chr(191);
Run Code Online (Sandbox Code Playgroud)

然后我把我的文字拿出来.没有手动BOM,像Notepad ++这样的编辑器会将文件识别为ANSI编码,使用假设的手动BOM,它将被识别为UTF-8,但将包含以下字符:


Run Code Online (Sandbox Code Playgroud)

在开始时.所以我假设通过启发式方法检测到它是UTF-8,我的手册BOM是错误的.

我该怎么做?

编辑: HEX内容按要求.我简单地将文字写成"SOME TEXT",然后我得到:

C3 AF C2 BB C2 BF 53 4F 4D 45 20 54 45 58 54
Run Code Online (Sandbox Code Playgroud)

将"SOME TEXT"保存为带有BOM的UTF-8产量:

EF BB BF 53 4F 4D 45 20 54 45 58 54
Run Code Online (Sandbox Code Playgroud)

Mic*_*rdt 1

您看到的是将 BOM 的各个字节解释为 IOS-8859-1,然后将结果编码为 UTF-8 的结果。至于为什么会发生这种情况,我怀疑该chr()函数 - 尝试使用 char 文字代替,即

echo "\xEF\xBB\xBF";
Run Code Online (Sandbox Code Playgroud)