将 PHP 标头到文本文件 - 删除编码



我有一个输出文本的php页面。我想将此页面下载到文本文件中。我正在使用:

header('Content-type: application/txt');
header("Content-Disposition: attachment; filename=savethis.txt");

这下载文件很好,但文件的内容不正确。我的文本是一个空格/字符分隔的文件,所以我有这样的行:

Data1     Data2             Data3

每个数据点之间有一定数量的空格。当它下载时,它不是像上面那样过来,而是显示像

Data1    Data2      Data3    

是否可以设置另一个标头,以便空格不被编码为"&nbsp"?我需要那里的空格,但不需要 html 空格字符。

我似乎想不通。任何帮助将不胜感激。谢谢。

简短的回答 - 不要对它们进行编码。

 是 Unicode 字符NO-BREAK SPACEU+00A0的命名 HTML 实体。所以这不是SPACE(U+0020(。您有一些代码可以显式添加它们和/或将它们编码到 HTML 实体。最好的选择是在源代码中找到该逻辑并对其进行更改。寻找可以增加 或调用的东西,例如htmlentites().

您的内容类型很奇怪(我希望text/plain(。从您的描述来看,浏览器似乎将您的响应呈现为 HTML。它解码实体并显示由不间断空格分隔的内容。如果您在浏览器的开发人员工具中查看响应的实际来源,则应包括实体。基本上,发生的事情与呈现HTML标记相同。

可以替换实体。一个简单的方法是字符串替换:

$out = str_replace(' ', ' ', $in);

正则表达式将允许替换实体组:

$out = preg_replace('(( )+)', ' ', $in);

但是,如果使用htmlentities()进行编码,则可能还会对其他字符进行编码。html_entity_decode()为命名的 HTML 实体提供解码,但结果将是无中断空格。您可能需要将其与str_replace()结合使用:

$in = 'hello world ähm';
$out = str_replace(
"u{00A0}", " ", html_entity_decode($in,  ENT_COMPAT | ENT_HTML401, 'utf-8')
);
var_dump($out);

输出:

string(16) "hello world ähm"

最新更新