Форум PHP программистов ► PHP практикум ► PHP для начинающих
Пейджер выключен!
Подписаться на тему
Уведомление на e-mail об ответах в тему, во время Вашего отсутствия на форуме.
Подписка на этот форум
Уведомление на e-mail о новых темах на форуме, во время Вашего отсутствия на форуме.
Скачать/Распечатать тему
Скачивание темы в различных форматах или просмотр версии для печати этой темы.
Кодирование запроса CURL в PHP
У меня есть некоторые незначительные проблемы с кодировкой. Я получаю строку данных json отсюда (попробуйте сами):
Имя в данных показано следующим образом:
Как я могу получить эти данные с надлежащей кодировкой, чтобы его Ари Скуласон?
Я попытался переключить его на utf-8, как это в php
который приблизил меня, но его все еще не так
установите еще один параметр curl для CURLOPT_ENCODING и установите для него значение «», чтобы гарантировать, что он не вернет мусор
Вы можете использовать заголовок
и после строки декодирования
Это сработало для меня
после добавить это
Вы также можете попробовать.
utf8_encode закодированный символ ASCII. Возврат некодированного ASCII может привести к поломке или возврату ошибки (в моем случае).
php — Как исправить кодировку сайта в ответ на cURL запрос?
Пожалуйста, помогите победить кодировку.
Проблема следующая, в ответ на curl приходит сайт в котором в meta прописана кодировка windows-1251 из-за этого на сайте отображаются иероглифы. Данную проблему решил с помощью:
Теперь если в meta стоит кодировка windows-1251 сайт отображается корректно. Если в meta стоит кодировка utf-8 сайт отображается корректно. Обрадовался. Но вдруг нашел пару сайтов, которые слетели после добавления:
в meta указана кодировка UTF-8 а сайт в результате в иероглифах, пример такого сайта: http://e-qa.ru/autoprodazha
Таких сайтов не много но они есть и очень раздражают, большинство сайтов где в meta UTF-8 работают корректно. Видимо кодировка самого файла у данного сайта e-qa.ru/autoprodazha отличается от указанной в meta из-за этого происходит конфликт.
Помогите разобраться и устранить иероглифы на всех сайтах, кучу методов перепробовал и все взаимоисключающие
Определение кодировки curl страницы
С помощью curl получаю данные со стороннего сайта, изначально его кодировка не известна. В случае если кодировка windows-1251 получаю не читаемый сайт (испорчена кодировка), мне нужно отображать utf-8.
iconv(«windows-1251», «UTF-8», $post); — помогает, НО если изначально кодировка и так utf-8 сайт я не получаю — белая страница.
curl_setopt($rCurl, CURLOPT_ENCODING, ‘gzip,deflate’); — не помогло вообще.
Нашел как мне кажется решение моей проблемы:
Как я понял, данная функция должна определить изначальную кодировку и потом, при необходимости изменить ее, но совладать с этим кодом я не смог.
Я не понял, где нужно задать нужную мне UTF-8 кодировку.
Мне кажется, что из строки $tab = array нужно удалить UTF-8, так как именно эта кодировка мне и нужна.
Пробовал еще так сделать:
function convert_utf8( $post ) < if ( strlen(utf8_decode($post)) == strlen($post) ) < // $string is not UTF-8 return iconv(«windows-1251», «UTF-8», $post); > else < // already UTF-8 return $post; > > echo $post; |
Сделал так и решил проблему:
$isWinCharset = mb_check_encoding($post, «windows-1251»); if ($isWinCharset) < $post = iconv(«Windows-1251», «UTF-8», $post); > |
Потом нашел пару сайтов, где код не помог.
В мета у сайтов стоит кодировка utf-8 но сам файл видимо в другой кодировке, из-за чего на сайте появляются иероглифы, пример такого сайта:
indikator.one-trading.ru
$isWinCharset = mb_check_encoding($post, «windows-1251»); if ($isWinCharset) < $post = iconv(«Windows-1251», «UTF-8», $post); > |
то сайт отображается корректно НО слетают сотни других, которые изначально в Windows-1251 кодировке.
Можно как-то зафиксировать эту проблему, возможно я что-то не так понимаю и сайт indikator.one-trading.ru на самом деле в utf-8 кодировке, тогда в чем проблема?
Может в строке $isWinCharset = mb_check_encoding($post, «windows-1251»);
прописать несколько кодировок, чтобы угадать нужную, как?
Определение кодировки curl страницы
Joined: 29 May 2006
Posts: 31
Posted: Thu Jun 22, 2006 9:48 am ( написано за 2 минуты 54 секунды ) Post subject: Кодировка русских символов и применение CURL |
|||
Делаю запрос страницы(test.php), где есть русские символы и отображаются нормально, когда вывожу на экран получается ерунда. Как можно кодировку поправить? Спасибо.
|
Участник форума
Joined: 25 May 2006
Posts: 52
Location: Москва
Posted: Thu Jun 22, 2006 9:56 am ( спустя 8 минут ; написано за 17 секунд ) Post subject: |
|
Смотрите в сторону iconv (www.softtime.ru/group/ > |
Участник форума
Joined: 29 May 2006
Posts: 31
Posted: Thu Jun 22, 2006 10:09 am ( спустя 12 минут ; написано за 57 секунд ) Post subject: |
|
К сожалению, функции iconv мне недоступны версия PHP 4, видимо |
Участник форума
Joined: 25 May 2006
Posts: 52
Location: Москва
Posted: Thu Jun 22, 2006 10:16 am ( спустя 6 минут ; написано за 3 минуты 28 секунд ) Post subject: |
|
Organ А в каком именно виде выводится ерунда. Если в одной из кирилических кодировок (естественно неверно отображающихся, раз кодировка в заголовке windows-1251), то возможно поможет функция convert_cyr_string(). softtime.ru/bookphp/gl3_7.php Еще можно попробовать переводить все русские символы в их юникод-сущности. Но это будет нещадно кушать трафик — на каждый байт занимаемый русской буквой будет приходится 7 байт юникод-сущности. Если же хотите — код могу дать. =) |
Участник форума
Joined: 29 May 2006
Posts: 31
Posted: Thu Jun 22, 2006 10:29 am ( спустя 13 минут ; написано за 1 минуту 50 секунд ) Post subject: |
|
Страница нормально отображается в utf-8. А когда делаю запрос curl’ом, приходит эта страничка в кодировке Cyrillic(WINDOWS). Функция convert_cyr_string не переводит в unicode.. Кстати с трафиком проблем нет-этот хитрый запрос делается по локалу. |
Участник форума
Joined: 25 May 2006
Posts: 52
Location: Москва
Posted: Thu Jun 22, 2006 10:43 am ( спустя 13 минут ; написано за 3 минуты 4 секунды ) Post subject: |
|
Organ Вы уверены что результат возвращается имеено в WINDOWS-1251. Какое header возвращает curl. Я вообще в curl не особо, но если страница test.php отображается в utf-8 (если я правильно понял), то зачем отправлять (а ведь как мне кажется curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); именно отправляет заголовки) заголовок с charset=windows-1251. PS: Если я не прав, прошу прощения и жду указаний на ошибки. =) |
Участник форума
Joined: 29 May 2006
Posts: 31
Posted: Thu Jun 22, 2006 10:47 am ( спустя 3 минуты ; написано за 2 минуты 47 секунд ) Post subject: |
|
Зашел на страницу test.php. Кодировка-utf8. Все нормально. Попереключал кодировки. Получил ту ерунду, что выводится с кодировкой cyrillic(windows). А те $headers я пробовал менять на utf-8, потом убрал- не помогло. Пробовал также echo utf8_encode($result). Тоже безрезультатно. |
Участник форума
Joined: 25 May 2006
Posts: 52
Location: Москва
Posted: Thu Jun 22, 2006 10:58 am ( спустя 11 минут ; написано за 2 минуты 13 секунд ) Post subject: |
|||||||
Вставьте эту опцию —
И посмотрите какие заголовки возвращаются вместе с файлом.
|
Участник форума
Joined: 29 May 2006
Posts: 31
Posted: Thu Jun 22, 2006 11:01 am ( спустя 3 минуты ; написано за 10 секунд ) Post subject: |
|
хедеры вот:
HTTP/1.1 100 Continue Server: Microsoft-IIS/4.0 Date: Thu, 22 Jun 2006 07:59:12 GMT HTTP/1.1 200 OK Server: Microsoft-IIS/4.0 Date: Thu, 22 Jun 2006 07:59:13 GMT Connection: close Content-Type: text/html Content-Length: 4203 Content: А строка с хедером не дала результатов. |
Участник форума
Joined: 25 May 2006
Posts: 52
Location: Москва
Posted: Thu Jun 22, 2006 11:05 am ( спустя 3 минуты ; написано за 2 минуты 17 секунд ) Post subject: |
|
Хммм. Даже не знаю что посоветовать еще. Попробуйте аналогичный заголовок выводить в test.php — в заголовках ответа не указана вообще никакая конкретная кодировка. А вообще советую обновить версию PHP и пользоваться iconv. =) |
Участник форума
Joined: 29 May 2006
Posts: 31
Posted: Thu Jun 22, 2006 11:11 am ( спустя 5 минут ; написано за 1 минуту 56 секунд ) Post subject: |
|
Так вся фишка в том, что «test.php» формируется фастрепортом и экспортом его в html, а у фильтра экспорта нигде кодировки нету :(. Ладно, спасибо за помощь буду искать. Придется думаю этот экспортированный файл разобрать и заменить кодировку. Гимор конечно, а что делать. |
Участник форума
Joined: 29 May 2006
Posts: 31
Posted: Thu Jun 22, 2006 11:21 am ( спустя 10 минут ; написано за 43 секунды ) Post subject: |
|
Поменял кодировку на windows-1251, а без толку все равно показывает UTF-8.. |
Участник форума
Joined: 25 May 2006
Posts: 52
Location: Москва
Posted: Thu Jun 22, 2006 11:34 am ( спустя 12 минут ; написано за 1 минуту 14 секунд ) Post subject: |
||||||||||||
Organ В приложении функция — она переводит все русские символы в юникод-сущности. Попробуйте перед выводом $result через нее пропустить. =)
|
Участник форума
Joined: 29 May 2006
Posts: 31
Posted: Thu Jun 22, 2006 11:40 am ( спустя 5 минут ; написано за 29 секунд ) Post subject: |
|
Понравилось «все русский символы» ). После этой функции совсем ерунда получается. |
Участник форума
Joined: 25 May 2006
Posts: 52
Location: Москва
Posted: Thu Jun 22, 2006 11:46 am ( спустя 6 минут ; написано за 1 минуту 23 секунды ) Post subject: |
|
Organ Мда, опечатался.. =) Странно. Ну, тогда у меня идеи кончились. =( Желаю удачи. Если найдете решение — рад буду узнать какое.. =) Last edited by VAFil on Thu Jun 22, 2006 11:58 am; edited 1 time in total |
Участник форума
Joined: 29 May 2006
Posts: 31
Posted: Thu Jun 22, 2006 11:56 am ( спустя 10 минут ; написано за 2 минуты 45 секунд ) Post subject: |
|
Как найду решение, напишу ).
У кого-нибудь есть идеи? Мои предположения: 1. Кодировку где-то устанавливает CGI-шка, экспортирующая отчет, хотя не нашел где. Спасибо. |
Участник форума
Joined: 29 May 2006
Posts: 31
Posted: Thu Jun 22, 2006 2:12 pm ( спустя 2 часа 15 минут ; написано за 1 минуту 29 секунд ) Post subject: |
|
Проблема решена! Дело было в автоустановке кодировки русского апача. Проблема описана тут: live.julik.nl/2004/05/stop_mod_charset Установил указанный строчки в конфигурационный файл(то есть отключил автокодировку) и все заработало cURL и кириллица!Почему, когда при помощи curl запрашиваю html-код какой-нибудь страницы, кириллические символы возвращаются вопросиками? Пишу на с++. Результат выводится в терминал. Введи в терминале curl www.nix.ru и увидишь их. Эти быдлокодеры не указали в html кодировку. Там кодировка windows 1251, а в linux обычно utf8.
Всё правильно. У тебя в терминале кодировка utf-8, а сервер выдаёт страничку в кодировке cp1251. Попробуй так (в терминале):
Они её указали в HTTP-заголовках: char c[] = «www.nix.ru»; string s = download_page(c); cout ( 14.02.10 20:27:39 ) Так чтоб в s уже приходил нормальный кириллический текст.
Нет, это просто вне компетенции libcurl. Помогите написать входные параметры для iconv(). string s — входная строка, string ss — выходная. Получение правильной кодировки из php cURL(см. обновление внизу сообщения) Используя регистратор сети Chrome, я замечаю данный запрос XHR: Запросить заголовки Заголовки ответов Содержание ответа: @EqV¡^MSÁ9 Отлично. Это правильный вывод. Теперь мне нужно воссоздать этот точный обмен внутри PHP с помощью cURL. Поэтому я дублирую запрос, используя те же заголовки. Однако выход здесь равен @EqV–¡^MSƒÁ9 , что явно отличается. Мне нужно получить его в исходном формате ( @EqV¡^MSÁ9 ), потому что в конечном итоге вывод PHP будет обслуживаться скрипту javascript, а значение charCodeAt имеет разные результаты между этими двумя charCodeAt . Я не уверен, как подойти к этой проблеме. Как вы можете видеть, после запроса XHR предварительный просмотр ответа в Chrome правильный: Если я изменил тип кодирования вывода моей PHP-страницы на @EqV¡^MSÁ9 (ISO-8859-15), я получаю @EqV¡^MSÁ9 . И если я вставляю этот вывод в Notepad++, я получаю что-то очень, очень похожее на то, что хочу, но все же немного другое (в данном случае разное на один символ). Может быть, это очень близко к кодировке, в которой я нуждаюсь? Как я могу найти нужную кодировку? Что такое кодировка по умолчанию хром, поскольку она, похоже, отлично реагирует на ответ? UPDATE: я тестировал новое значение: òÝD¶0v¢ÔL·ßÎO Ó , и использование mb_convert_encoding($r, ‘utf-8’, ‘ISO-8859-15’) дало мне правильный результат. Так почему же кодирование этого конкретного ответа ( @EqV¡^MSÁ9 ) дает мне значение, которое является коротким символом? php — Как исправить кодировку сайта в ответ на cURL запрос?Пожалуйста, помогите победить кодировку. Проблема следующая, в ответ на curl приходит сайт в котором в meta прописана кодировка windows-1251 из-за этого на сайте отображаются иероглифы. Данную проблему решил с помощью: Теперь если в meta стоит кодировка windows-1251 сайт отображается корректно. Если в meta стоит кодировка utf-8 сайт отображается корректно. Обрадовался. Но вдруг нашел пару сайтов, которые слетели после добавления: в meta указана кодировка UTF-8 а сайт в результате в иероглифах, пример такого сайта: http://e-qa.ru/autoprodazha Таких сайтов не много но они есть и очень раздражают, большинство сайтов где в meta UTF-8 работают корректно. Видимо кодировка самого файла у данного сайта e-qa.ru/autoprodazha отличается от указанной в meta из-за этого происходит конфликт. Помогите разобраться и устранить иероглифы на всех сайтах, кучу методов перепробовал и все взаимоисключающие Определение кодировки curl страницыЗдесь могла бы быть ваша реклама Покинул форум Секрет Само собой я знаю что ответят мне тут же, и если я посмотрю После этого приходится начинать уточнять этим неграмотным что мне надо. Уверен что если бы я им сказал что у меня есть Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме: На последок как оно происходит на форумах Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался! Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12 cURL и кириллица!Почему, когда при помощи curl запрашиваю html-код какой-нибудь страницы, кириллические символы возвращаются вопросиками? Пишу на с++. Результат выводится в терминал. Введи в терминале curl www.nix.ru и увидишь их. Эти быдлокодеры не указали в html кодировку. Там кодировка windows 1251, а в linux обычно utf8.
Всё правильно. У тебя в терминале кодировка utf-8, а сервер выдаёт страничку в кодировке cp1251. Попробуй так (в терминале):
Они её указали в HTTP-заголовках: char c[] = «www.nix.ru»; string s = download_page(c); cout ( 14.02.10 20:27:39 ) Так чтоб в s уже приходил нормальный кириллический текст.
Нет, это просто вне компетенции libcurl. Помогите написать входные параметры для iconv(). string s — входная строка, string ss — выходная. |