【问题标题】:PHP: How to put out text/plain content in UTF-8 with BOM for download?PHP:如何将带有 BOM 的 UTF-8 文本/纯文本内容用于下载?
【发布时间】: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


【解决方案1】:

检查您的 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()

【讨论】:

  • 我禁用了以下,重新启动了 Apache,它仍然是一样的。 ;extension=php_mbstring.dll ;extension=php_exif.dll
  • 但是可以将 BOM 写入服务器上的文件。
【解决方案2】:

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

echo "\xEF\xBB\xBF";

【讨论】:

  • 当 Fivell 在他的回答中提出建议时,我确实尝试过。结果相同。我也在现场 LAMP 和本地测试 WAMP 环境中尝试过。
猜你喜欢
  • 1970-01-01
  • 2014-03-10
  • 2014-03-04
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
相关资源
最近更新 更多