Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×

Проблеми з записом кирилиці в файл за допомогою функції saveHTMLFile() в PHP

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Зразу ссилочка на тему на іншому форумі www.codingforums.com/showthread.php?t=295702
Є в мене текстовий файл в UTF-8 в якому є рядки з текстом російською

Если поставят в 7-ми дюймовый планшет, так пусть и в какой нить смартфон поставят. Преинтереснейшая штука получится !

вот и славненько не придется переустанавливать) обновимся и все)

Хоть блу, хоть грин, да хоть рэд, по сути это всего лишь сервиспак, а они и раньше просто скачивались и устанавливались
Читаємо файл за доп. функції file:
$comments = file('comments.txt', FILE_SKIP_EMPTY_LINES|FILE_IGNORE_NEW_LINES);

І є HTML файл (теж в UTF-8):

<!DOCTYPE html>
<html><head><title></title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head><body>
        <div id="allComments">
            testka
            <p class="comment">
                Comments
            </p>
            <p class="comment">
                Comment 2
            </p>
        </div>
</body>

Який зчитується наступним чином:

   
$dom = new DOMDocument();
$dom->loadHTMLFile('comments.html');
$dom->validateOnParse = true;
$dom->preserveWhiteSpace = false;
Далі тегів pre не буде. Якщо коротше, то з масиву comments текст приєднується до елементу з id allComments і це все потім записується функцією saveHTMLFile.
В результаті всіх цих маніпуляцій HTML сторінка в браузері відображається нормально, але якщо заглянути в файл якимось редактором, то отримаємо таке www.dropbox.com/...​jmmix8fn1qvvu0/output.jpg
На codingforums.com мені написали, що це
are the entities for the unicode output as described in HTML entities

Мені таки вдалося записувати «нормльний» текст в файл, але через жопу. Може я не знаю якоїсь функції використання якої вирішить всі проблеми? І невже ніхто з чимось подібни не стикався? Трохи пошукавши знайшов оце phpclub.ru/...​tml-и-savehtmlfile.52901 Далі шукати не став і пішов jabber конференцію на jabber.ru а потім на форум.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

PHP функція html_entity_decode і кирилиця

В любому PHP вибираю дані з БД і викликаю для них вищевказану функцію і в результаті отримую знаки питання і ромбики замість кирилиці. Дані мають таки вигляд:

   <br />                            <p><strong>Кресло FENIC CHROME</strong></p><br /><p><strong><img ilo-full-src="/uplimg/catitem2/_jpg.jpg" alt="" src="/uplimg/catitem2/_jpg.jpg" height="319" width="307"></strong></p><br /><p> </p><
Як бути?

старая особенность libxml, указание кодировки (charset=UTF-8)должно быть до любого не ascii текста (в данном случае до тайтла). фиксится просто регуляркой переставляющей <meta> местами до <title> в полученном файле до создания DOM

кстати, для парсинга можете посмотреть на querypath (отличная оббертка над domdocument + css селекторы!) или simplehtmldom (движок в основном на регулярках и менее ф-на чем первая, но для простого и быстрого разбора подойдёт)

если нужно именно много парсить, а язык не решает, то исключительно grablib

для промышленного парсинга, grablib имхо удобнее, так как специально под это заточен, а scrapy, всё-таки, в первую очередь, больше асинхронный (благодаря твистед) спайдер

echo ’==start==’;
//$url = “dou.ua/...ums/topic/7520”;
//$domSrc = file_get_contents($url);
// работает идентично, что из файла, что с сети
$domSrc = file_get_contents(’d.html’);
$dom = new DomDocument($encoding=’utf-8′);
$dom->loadHTML( $domSrc );
$xpath = new DOMXpath( $dom );
$elements = $xpath->query("//*[@class=’l-comment’]/*/p");
$to_file = ’’;
foreach ($elements as $e) {
$to_file .= $e->nodeValue;
}
file_put_contents(’_’, $to_file);
echo ’==end==’;

лол нет форматирования кода. Макс, куда ты смотришь

Насколько я понял баг bugs.php.net/...ug.php?id=48983 все еще актуален. Так что пользуйтесь велосипедами или темплейтами для вывода в html

$new_dom = new DOMDocument($version=’1.0′, $encoding=’windows-1251′);
$new_dom->formatOutput = true;
$root = $new_dom->createElement(’html’);
$root = $new_dom->appendChild($root);
$text = $new_dom->createElement(’p’, ’Тестовая надпись’);
$text = $root->appendChild($text);
$new_dom->saveHTMLFile("raw.html");

Не работает твой код. Output:

Т ; &# 10 77;
89;т 086;ва 103;
85;
72;
76;
87;l 0;l 9; 00;

Код на ДОУ? Вы ошиблись форумом.

Можливо це й добре, що тут в основному обговорються теми які не мають прямого відношення (або взагалі ніяк не пов’язані) до коду, програмування і т.п. Можливо на інших форумах люди зайо... подібними темами, а тут декілька раз в місяць які-небудь 23-річні сеньйори і сеньйорити відволічуться від теми «ТрахниДруга...» і напишуть мені чи комусь іншому що небудь.

Можно попробовать добавить кодировку непосредственно перед вставляемым контентом, правда это костыль.

$dom->loadHTML('<xml encoding="UTF-8">' . file_get_contents('comments.html'));

Треба спробувати. Я спершу подумав, що це все зіпсує, якщо додати до HTML файлу, але тут htmlpurifier.org/...#fixcharset-xml написано що ні. Правда там тільки про XHTML. Але там же написно, що

For XHTML, this XML Declaration theoretically overrides the META tag.
Тож це, скоріш за все, не має смислу. Але тре спробувати.

Ну или аналогичным способом приклеить meta charset = utf-8. С зендовым DOM по крайней мере помогало.

убедись, что точно везде все в одной кодировке, если все ок, пропускай через html_entity_decode или откажись вообще от saveHTMLFile

Не ту кнопку натиснув. Я і пропускав через функцію html_entity_decode. І воно перекодовувавло. Але якщо записати в файл те що вийшло функцією saveHTMLFile, то все ондно отримуємо не буковки кирилиці. Прийшов до такого вирішення (без використання вищеназваної функції):

file_put_contents(’comments.html’,$dom->saveHTML());

Не розумію за що мене підтримали, зчитую файлик HTML так(може кому цікаво):

$dom->loadHTML(file_get_contents('comments.html'));

stackoverflow.com/...lf-closing-tags

DOMDocument->saveHTML() takes your XML DOM infoset and writes it out as old-school HTML, not XML.

Який саме файл? Для створення HTML файлу використовував Komodo Edit який пише, що UTF-8.
Файл comments було створено за доп. Kwrite і збережено в UTF-8. Програма типово зберігає в такому кодуванні. А взагалі то так, щойно повідкривав в Kate comments.html і comments до запису і після запису в comments.html. В обох випадках в рядку статуса, чи як там воно, стоїть UTF-8

Там де Comments Comments 2 мало б бути

Comments ну і далі.
І коли пишеш багато тексту, то блок з тегами до якого ше треба сторінку прокручувати дуже незручно.

Підписатись на коментарі