Кодировки символов и file_get_contents

0

Я изучаю PHP-программирование, и я тестирую некоторые вещи.

Я пытаюсь загрузить некоторые данные HTML с помощью:

$this->html = file_get_contents($this->url);

$fh = fopen('txt\htm.txt', 'w') or die("can't open file");
        fwrite($fh, $this->html);
        fclose($fh);

Как только я запустил этот скрипт, он загружает HTML со страницы и сохраняет его в текстовом файле; здесь все работает нормально.

Внутри файла HTML есть некоторые данные, которые я хочу извлечь и сохранить в памяти.

Пример:

  • "автомобиль"
  • "банан"
  • "tâllian" <-
  • "собака"

Код, который я использую: (Я использую XPath)

$doc = new DOMDocument;
@$doc->loadHTML($this->html);
$xpath = new DOMXpath($doc);

    $this->string1 = $this->GetName('//div/div[2]/table/tbody/tr[1]/td[1]/a/span',$xpath);
        $this->string2 = $this->GetName('//div/div[2]/table/tbody/tr[2]/td[1]/a/span',$xpath);
        $this->string3 = $this->GetName('//div/div[2]/table/tbody/tr[3]/td[1]/a/span',$xpath);  
        $this->string4 = $this->GetName('//div/div[2]/table/tbody/tr[4]/td[1]/a/span',$xpath);


    private function GetName($xquery,$xpath)
    {
        $result_rows = $xpath->query($xquery);
        foreach ($result_rows  as $result_object)
        {
            return substr($result_object->nodeValue, strpos($result_object->nodeValue, '>')+1,strlen($result_object->nodeValue) );
        }

}

И если я напечатаю:

echo 'tâllian<br>';
echo $this->string1.'<br>';
echo $this->string2.'<br>';
echo $this->string3.'<br>'; //tâllian
echo $this->string4.'<br>';

Результат:

  • tâllian <-
  • автомобиль
  • банан
  • tà ¢ llian <-
  • собака

Поэтому моя проблема заключается в том, почему сценарий возвращает "tà ¢ llian" вместо "tâllian"?

Я ожидаю, что эти проблемы вызваны моей функцией GetName... Как вы думаете?

Интересные факты

  • Когда я ищу слово "tâllian" в своем текстовом файле ("txt\htm.txt"), я нахожу его чистым и понятным.
  • Когда я выполняю echo 'tâllian'; он возвращает его чистым и понятным, потому что у меня есть заголовок header: header('Content-Type: text/html; charset=utf-8');

найденное решение:

$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'utf-8');
$doc = new DOMDocument;
@$doc->loadHTML($html);

Его необходимо преобразовать, прежде чем создавать новый DOMDocument.

  • 1
    спасибо за исправление моей темы :), я одобряю это
  • 1
    Да, извините, я редактировал его 3 раза. Я тоже сделал несколько опечаток: /. В любом случае, я пытался ответить на ваш вопрос.
Показать ещё 2 комментария
Теги:
echo
utf-8

2 ответа

0
Лучший ответ

найденное решение:

$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'utf-8');
$doc = new DOMDocument;
@$doc->loadHTML($html);

Его необходимо преобразовать, прежде чем создавать новый DOMDocument.

  • 0
    правильный ответ <- мне нужно 2 дня, чтобы подтвердить
  • 0
    я автор, и я просто поделился решением, которое я нашел, мир
0

Что произойдет, если вы используете htmlentities(); метод? Попробуйте следующий код:

echo htmlentities($this->string3) . "<br />";

Вероятно, это связано с тем, что эти специальные символы (в этом случае A с крышей) неправильно печатаются, когда вы печатаете их как обычный текст. Вы должны печатать их как объект HTML. Метод, использованный ниже, делает это автоматически.

Дополнительную информацию об этом методе можно найти на странице PHP: htmlentities

  • 1
    я попробую, спасибо за ответ :)
  • 0
    скомпилировано и протестировано, тот же результат
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню