Intereting Posts
Как взять все слова в одном нормальном массиве из базы данных в рамках Laravel с минимальной потерей времени? тип экспонента экспоненциального числа до int или float Метод шифрования, который реализован как для php, так и для java? Настройте базовый url в codeigniter Удалить пользователя полностью php-скрипты получают значение узла, если оно равно заданному значению; изменение значения узла имеет один и тот же родительский узел Как получить внешний купон / ваучер на странице для работы в OpenCart? Соответствие регулярных выражений и вложенные элементы Преобразование числа с запятой в виде десятичной точки для плавания MySQL конвертирует кодировку Арабский скрипт в формате PDF, созданный UFPDF Удалить повторяющиеся значения из многомерного массива на основе определенного ключа Disqus API создает сообщение об ошибке ffmpeg / PHP – Проблемы с конвертированием любого видеоформата в ogg – Choppy Video / No Audio – win64 перенаправить после публикации?

file_get_contents () преобразует UTF-8 в ISO-8859-1

Я пытаюсь получить результаты поиска с yahoo.com .

Но file_get_contents () конвертирует кодировку UTF-8 (кодировка, которая использует yahoo) в ISO-8859-1.

Пытаться:

$filename = "http://search.yahoo.com/search;_ylt=A0oG7lpgGp9NTSYAiQBXNyoA?p=naj%C5%A1%C5%A5astnej%C5%A1%C3%AD&fr2=sb-top&fr=yfp-t-701&type_param=&rd=pref"; echo file_get_contents($filename); 

Скрипты как

 header('Content-Type: text/html; charset=UTF-8'); 

или

 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

или

 $er = mb_convert_encoding($filename , 'UTF-8'); 

или

 $s2 = iconv("ISO-8859-1","UTF-8",$filename ); 

или

 echo utf8_encode(file_get_contents($filename)); 

НЕ помогите, потому что после получения веб-контента специальные символы как š ť ž заменяются вопросительными знаками ???

Я был бы признателен за любую помощь.

Это, кажется, проблема согласования контента, поскольку file_get_contents вероятно, отправляет запрос, который принимает только ISO 8859-1 в качестве кодировки символов.

Вы можете создать настраиваемый контекст потока для file_get_contents используя stream_context_create который явно заявляет, что вы принимаете UTF-8:

 $opts = array('http' => array('header' => 'Accept-Charset: UTF-8, *;q=0')); $context = stream_context_create($opts); $filename = "http://search.yahoo.com/search;_ylt=A0oG7lpgGp9NTSYAiQBXNyoA?p=naj%C5%A1%C5%A5astnej%C5%A1%C3%AD&fr2=sb-top&fr=yfp-t-701&type_param=&rd=pref"; echo file_get_contents($filename, false, $context); 

file_get_contents не должны изменять кодировку. Данные втягиваются как двоичная строка.

При проверке URL, который вы указали, это заголовок, который он предоставляет:

 Content-Type: text/html; charset=ISO-8859-1 

Кроме того, в теле:

 <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> 

Кроме того, вы не можете конвертировать UTF-8 без потерь в ISO-8859-1 и вернуть символы обратно в UTF-8. UTF-8 / unicode поддерживает гораздо больше символов, поэтому символы теряются на первом этапе.

В браузере это не так, поэтому, возможно, вам просто нужно предоставить правильный заголовок Accept-Encoding, чтобы проинструктировать систему yahoo, вы можете принять UTF-8.

Для тех, кто расследует это:

Время, которое я потратил на проблемы с кодированием, научило меня, что редко функции php «волшебным образом» меняют кодировку строк. (Один из таких редких примеров:

  exec ($ command, $ output, $ returnVal) 

Также обратите внимание, что рабочий набор заголовков выглядит следующим образом:

  header ('Content-Type: text / html; charset = utf-8'); 

и не:

  header ('Content-Type: text / html; charset = UTF-8'); 

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

Надеюсь это поможет!

 $s2 = iconv("ISO-8859-1","UTF-8//TRANSLIT//IGNORE",$filename ); 

Лучшее решение …

 function curl($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_ENCODING, 1); return curl_exec($ch); curl_close($ch); } echo curl($filename);