PHP:如何将带 BOM 的 UTF-8 文本/纯文本内容输出以供下载?

标签 php utf-8 byte-order-mark

我需要提供一个纯文本文件供下载。文本文件需要采用 UTF-8 编码,并且需要存在 BOM。我将我的 php 文件保存为不带 BOM 的 UTF-8 并发送以下 header :

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

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

echo chr(239).chr(187).chr(191);

然后我放出我的文字。如果没有手动 BOM,像 Notepad++ 这样的编辑器将识别文件为 ANSI 编码,如果使用假定的手动 BOM,它将被识别为 UTF-8,但将包含以下字符:



一开始。所以我假设通过启发式方法检测到它是 UTF-8,而我的手动 BOM 是错误的。

我该怎么做才正确?

编辑: 要求的十六进制内容。我只是将文本设为“SOME TEXT”,然后得到:

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 的各个字节解释为 IOS-8859-1,然后将结果编码为 UTF-8 的结果。至于为什么会发生这种情况,我怀疑 chr() 函数 - 尝试改用 char 文字,即

echo "\xEF\xBB\xBF";

关于PHP:如何将带 BOM 的 UTF-8 文本/纯文本内容输出以供下载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13056849/

相关文章:

utf-8 - 使用 BOM 编译 (javac) UTF8 编码的 Java 源代码

javascript - 表单中不发送按钮数据

mysql - latin-1 到 utf-8 数据库

php - 将 html 实体转换为 UTF-8,但保留现有的 UTF-8

encoding - 如何停止 Server.HtmlEncode 编码 UTF8 字符?

c++ - 读取/存储不同类型的字符串(utf8/utf16/ansi)

c# - 创建没有 BOM 的文本文件

php - 如何检查产品是否由 woocommerce 中的用户创建

php - 使用数据库中的 session 数据进行缩放

PHP FPDF 分页符不起作用