7

我需要提供一个纯文本文件供下载。文本文件需要进行 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 是错误的。

我该怎么做?

编辑:按要求提供十六进制内容。我只是将文本设为“某些文本”,然后得到:

C3 AF C2 BB C2 BF 53 4F 4D 45 20 54 45 58 54

将“某些文本”保存为带有 BOM 的 UTF-8 会产生:

EF BB BF 53 4F 4D 45 20 54 45 58 54
4

2 回答 2

1

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

echo "\xEF\xBB\xBF";
于 2012-10-24T20:57:59.410 回答
0

检查您的 mbstring 扩展的设置(可以设置为自动编码输出)

; This directive specifies the regex pattern of content types for which mb_output_handler()
; is activated.
; Default: mbstring.http_output_conv_mimetype=^(text/|application/xhtml\+xml)
; mbstring.http_output_conv_mimetype=

"\xEF\xBB\xBF"&都chr(239).chr(187).chr(191)可以用来生成BOM,你可以file_put_contents()自己试试。

于 2012-10-24T21:25:33.967 回答