Заголовок PHP в текстовый файл - удалить кодировку - PullRequest
0 голосов
/ 10 октября 2019

У меня есть страница php, которая выводит текст. Я хочу загрузить эту страницу в текстовый файл. Я использую:

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

Этот файл загружается просто отлично, но содержимое файла неверно. Мой текст представляет собой файл, разделенный пробелами и символами, поэтому у меня есть такие строки:

Data1     Data2             Data3

С установленным количеством пробелов между каждым точкой данных. Когда он загружается, вместо того, чтобы переходить, как описано выше, он показывает, как

 Data1    Data2      Data3    

Есть ли другой заголовок, который я могу установить, чтобы пробелы не кодировались для чтения ""? Мне нужны пробелы там, но не символ пробела html.

Я не могу понять это. Любая помощь будет оценена. Благодарю.

1 Ответ

0 голосов
/ 10 октября 2019

Краткий ответ - не кодируйте их. :-)

  - это именованная сущность HTML для символа Unicode NO-BREAK SPACE или U+00A0. Так что это не 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"
...