2013-11-30 3 views
0

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

Я пытался загрузить некоторые 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('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

Как насчет информации о кодировании в самом документе HTML? Возможно, метатег, который указывает, что контент - это нечто иное, чем UTF-8 (например, ISO 8859-1)? Есть также некоторые другие люди, которые опубликовали комментарии в документации PHP относительно способов принудительной обработки UTF-8. http://us1.php.net/manual/en/domdocument.loadhtml.php#74777 –

ответ

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 />"; 

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

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

+1

Я собираюсь попробовать, спасибо за ответ :) –

+0

составлен и протестирован, тот же результат –

+0

Хм, это печально. Но, тем не менее, все-таки замечательно, что вы проверили код. –

Смежные вопросы