- PHP Curl UTF-8 Charset
- Перекодировка текста UTF-8 и WINDOWS-1251
- windows-1251 в UTF-8
- UTF-8 в windows-1251
- Когда ни что не помогает
- File_get_contents / CURL
- Как исправить кодировку сайта в ответ на cURL запрос?
- utf 8 — PHP Curl UTF-8 Charset
- Answer
- Solution:
- Answer
- Solution:
- Answer
- Solution:
- Answer
- Solution:
- Answer
- Solution:
- Answer
- Solution:
- First method (internal function)
- Second Method (using cURL function)
- Share solution ↓
- Additional Information:
- Didn’t find the answer?
- Similar questions
- Write quick answer
- About the technologies asked in this question
- PHP
- HTML
- Welcome to programmierfrage.com
- Get answers to specific questions
- Help Others Solve Their Issues
- Кодирование запроса CURL в PHP
PHP Curl UTF-8 Charset
У меня есть php-скрипт, который вызывает другую веб-страницу и записывает все html страницы, и все идет нормально, но проблема с кодировкой. Моя кодировка php-файлов – это utf-8, и все остальные php-файлы работают нормально (это означает, что на сервере нет проблем). Какая недостающая вещь в этом коде и все испанские буквы выглядят странно. PS. Когда я написал эти странные символы в версии для php, все они выглядят точными.
header("Content-Type: text/html; charset=utf-8"); function file_get_contents_curl($url) < $ch=curl_init(); curl_setopt($ch,CURLOPT_HEADER,0); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1); $data=curl_exec($ch); curl_close($ch); return $data; >$html=file_get_contents_curl($_GET["u"]); $doc=new DOMDocument(); @$doc->loadHTML($html);
Простой: когда вы используете curl, он кодирует строку в utf-8 вам просто нужно их декодировать.
Description string utf8_decode ( string $data )
Эта функция декодирует данные, предполагаемые UTF-8 , в ISO-8859-1 .
Вы можете использовать заголовок
header('Content-type: text/html; charset=UTF-8');
и после строки декодирования
$page = utf8_decode(curl_exec($ch));
function page_title($val) < include(dirname(__FILE__).'/simple_html_dom.php'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$val); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0'); curl_setopt($ch, CURLOPT_ENCODING , "gzip"); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); $return = curl_exec($ch); $encot = false; $charset = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); curl_close($ch); $html = str_get_html('"'.$return.'"'); if(strpos($charset,'charset=') !== false) < $c = str_replace("text/html; charset=","",$charset); $encot = true; >else < $lookat=$html->find('meta[http-equiv=Content-Type]',0); $chrst = $lookat->content; preg_match('/charset=(.+)/', $chrst, $found); $p = trim($found[1]); if(!empty($p) && $p != "") < $c = $p; $encot = true; >> $title = $html->find('title')[0]->innertext; if($encot == true && $c != 'utf-8' && $c != 'UTF-8') $title = mb_convert_encoding($title,'UTF-8',$c); return $title; >
$output = curl_exec($ch); $result = iconv("Windows-1251", "UTF-8", $result);
Я mb_detect_encoding(curl_exec($ch)); файл с кодировкой windows-1252 через cURL и mb_detect_encoding(curl_exec($ch)); вернулся UTF-8. Пробовал utf8_encode(curl_exec($ch)); и символы были правильными.
Лучшим способом, который я пробовал раньше, является использование urlencode() . Имейте в виду, не используйте его для всего URL-адреса. Используйте его только для частей, которые вам нужны, например, для персидских символов. Однако есть лучшие способы, если диапазон символов, которые вы хотите кодировать, более ограничен. Один из этих способов – использовать CURLOPT_ENCODING , перейдя к другому curl_setopt() :
curl_setopt($ch, CURLOPT_ENCODING, "");
Перекодировка текста UTF-8 и WINDOWS-1251
Проблема кодировок часто возникает при написании парсеров, чтении данных из xml и CSV файлов. Ниже представлены способы эту проблему решить.
windows-1251 в UTF-8
$text = iconv('windows-1251//IGNORE', 'UTF-8//IGNORE', $text); echo $text;
$text = mb_convert_encoding($text, 'UTF-8', 'windows-1251'); echo $text;
UTF-8 в windows-1251
$text = iconv('utf-8//IGNORE', 'windows-1251//IGNORE', $text); echo $text;
$text = mb_convert_encoding($text, 'windows-1251', 'utf-8'); echo $text;
Когда ни что не помогает
$text = iconv('utf-8//IGNORE', 'cp1252//IGNORE', $text); $text = iconv('cp1251//IGNORE', 'utf-8//IGNORE', $text); echo $text;
Иногда доходит до бреда, но работает:
$text = iconv('utf-8//IGNORE', 'windows-1251//IGNORE', $text); $text = iconv('windows-1251//IGNORE', 'utf-8//IGNORE', $text); echo $text;
File_get_contents / CURL
Бывают случаи когда file_get_contents() или CURL возвращают иероглифы (ÐлмазнÑе боÑÑ) – причина тут не в кодировке, а в отсутствии BOM-метки.
$text = file_get_contents('https://example.com'); $text = "\xEF\xBB\xBF" . $text; echo $text;
Ещё бывают случаи, когда file_get_contents() возвращает текст в виде:
Это сжатый текст в GZIP, т.к. функция не отправляет правильные заголовки. Решение проблемы через CURL:
function getcontents($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, 'gzip'); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $output = curl_exec($ch); curl_close($ch); return $output; >echo getcontents('https://example.com');
Как исправить кодировку сайта в ответ на cURL запрос?
Проблема следующая, в ответ на curl приходит сайт в котором в meta прописана кодировка windows-1251 из-за этого на сайте отображаются иероглифы.
Данную проблему решил с помощью:
$isWinCharset = mb_check_encoding($postResult, "windows-1251"); if ($isWinCharset)
Теперь если в meta стоит кодировка windows-1251 сайт отображается корректно.
Если в meta стоит кодировка utf-8 сайт отображается корректно.
Обрадовался.
Но вдруг нашел пару сайтов, которые слетели после добавления:
$isWinCharset = mb_check_encoding($postResult, "windows-1251"); if ($isWinCharset)
в meta указана кодировка UTF-8 а сайт в результате в иероглифах, пример такого сайта: e-qa.ru/autoprodazha
Таких сайтов не много но они есть и очень раздражают, большинство сайтов где в meta UTF-8 работают корректно. Видимо кодировка самого файла у данного сайта e-qa.ru/autoprodazha отличается от указанной в meta из-за этого происходит конфликт.
Помогите разобраться и устранить иероглифы на всех сайтах, кучу методов перепробовал и все взаимоисключающие 🙁
Собственно Вам удаленный сайт уже и так всё говорит, почему бы не учесть то, что он говорит?
1. Заглядываем в заголовки HTTP ответа, видим:
Content-Type:text/html; charset=UTF-8
2. Заглядываем в контент страницы, видим:
3. Есть еще один метод подсказать кодировку:
Решение — смотрим, чего нам говорят, подставляем в качестве параметра для iconv, но не забываем дефолтное значение на всякий случай.
Вариант решения — если сайтов в ограниченное количество, храните где-то предпочитаемую кодировку.
Фрагмент на python, реализующий автоматическое декодирование на основании заголовка ответа:
encoding='utf-8' # кодировка по умолчанию tmp = r.headers.get('Content-Type').split('=') #режем по =, что справа - кодировка if len(tmp)>1: #если кодировка в заголовке есть - будет 2 элемента encoding=tmp[-1] # тогда берём последний page = r.content.decode(encoding)
1) < $headers[strtolower($tmp[0])] = trim(strtolower($tmp[1])); >> $encoding="utf-8"; //default if (isset($headers['content-type'])) < $tmp = explode("=", $headers['content-type']); if (count($tmp)>1) $encoding = $tmp[1]; > if ($encoding != "utf-8") $postResult = iconv($encoding, "UTF-8", $postResult);
Всё. Получаем расширенный ответ, который содержит заголовки. Вырезаем из него заголовки и режем их в массив, плюс достаём тело ответа.
Парсим заголовки http, вытаскиваем content-type и из него вытаскиваем кодировку
utf 8 — PHP Curl UTF-8 Charset
I have an php script which calls another web page and writes all the html of the page and everything goes ok however there is a charset problem. My php file encoding is utf-8 and all other php files work ok (that means there is no problem with server). What is the missing thing in that code and all spanish letters look weird. PS. When I wrote these weird characters original versions into php, they all look accurate.
header("Content-Type: text/html; charset=utf-8"); function file_get_contents_curl($url) < $ch=curl_init(); curl_setopt($ch,CURLOPT_HEADER,0); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1); $data=curl_exec($ch); curl_close($ch); return $data; >$html=file_get_contents_curl($_GET["u"]); $doc=new DOMDocument(); @$doc->loadHTML($html);
Answer
Solution:
Simple: When you use curl it encodes the string to utf-8 you just need to decode them..
Description string utf8_decode ( string $data )
This function decodes data , assumed to be UTF-8 encoded, to ISO-8859-1 .
Answer
Solution:
header('Content-type: text/html; charset=UTF-8');
and after decoding the string
$page = utf8_decode(curl_exec($ch));
Answer
Solution:
$output = curl_exec($ch); $result = iconv("Windows-1251", "UTF-8", $output);
Answer
Solution:
function page_title($val) < include(dirname(__FILE__).'/simple_html_dom.php'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$val); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0'); curl_setopt($ch, CURLOPT_ENCODING , "gzip"); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); $return = curl_exec($ch); $encot = false; $charset = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); curl_close($ch); $html = str_get_html('"'.$return.'"'); if(strpos($charset,'charset=') !== false) < $c = str_replace("text/html; charset=","",$charset); $encot = true; >else < $lookat=$html->find('meta[http-equiv=Content-Type]',0); $chrst = $lookat->content; preg_match('/charset=(.+)/', $chrst, $found); $p = trim($found[1]); if(!empty($p) && $p != "") < $c = $p; $encot = true; >> $title = $html->find('title')[0]->innertext; if($encot == true && $c != 'utf-8' && $c != 'UTF-8') $title = mb_convert_encoding($title,'UTF-8',$c); return $title; >
Answer
Solution:
I was fetching a windows-1252 encoded file via cURL and the mb_detect_encoding(curl_exec($ch)); returned UTF-8. Tried utf8_encode(curl_exec($ch)); and the characters were correct.
Answer
Solution:
First method (internal function)
Second Method (using cURL function)
However, there are better ways if the range of characters have to be encoded is more limited. One of these ways is using CURLOPT_ENCODING , by passing it to :
curl_setopt($ch, CURLOPT_ENCODING, "");
Share solution ↓
Additional Information:
Didn’t find the answer?
Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.
Similar questions
Find the answer in similar questions on our website.
Write quick answer
Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.
About the technologies asked in this question
PHP
PHP (from the English Hypertext Preprocessor — hypertext preprocessor) is a scripting programming language for developing web applications. Supported by most hosting providers, it is one of the most popular tools for creating dynamic websites. The PHP scripting language has gained wide popularity due to its processing speed, simplicity, cross-platform, functionality and distribution of source codes under its own license.
https://www.php.net/
HTML
HTML (English «hyper text markup language» — hypertext markup language) is a special markup language that is used to create sites on the Internet. Browsers understand html perfectly and can interpret it in an understandable way. In general, any page on the site is html-code, which the browser translates into a user-friendly form. By the way, the code of any page is available to everyone.
https://www.w3.org/html/
Welcome to programmierfrage.com
programmierfrage.com is a question and answer site for professional web developers, programming enthusiasts and website builders. Site created and operated by the community. Together with you, we create a free library of detailed answers to any question on programming, web development, website creation and website administration.
Get answers to specific questions
Ask about the real problem you are facing. Describe in detail what you are doing and what you want to achieve.
Help Others Solve Their Issues
Our goal is to create a strong community in which everyone will support each other. If you find a question and know the answer to it, help others with your knowledge.
Кодирование запроса CURL в PHP
У меня есть некоторые незначительные проблемы с кодировкой. Я получаю строку данных json отсюда (попробуйте сами):
http://cdn.content.easports.com/fifa/fltOnlineAssets/C74DDF38-0B11-49b0-B199-2E2A11D1CC13/2014/fut/items/web/179899.json
Имя в данных показано следующим образом:
Как я могу получить эти данные с надлежащей кодировкой, чтобы его Ари Скуласон?
Я попытался переключить его на utf-8, как это в php
который приблизил меня, но его все еще не так
$location = 'http://cdn.content.easports.com/fifa/fltOnlineAssets/C74DDF38-0B11-49b0- B199-2E2A11D1CC13/2014/fut/items/web/179899.json'; $ch = curl_init($location); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Accept: application/json')); $r = curl_exec($ch); curl_close($ch); echo mb_detect_encoding($r); $r = mb_convert_encoding($r,'ISO-8859-1','utf-8'); print_r($r);
установите еще один параметр curl для CURLOPT_ENCODING и установите для него значение «», чтобы гарантировать, что он не вернет мусор
curl_setopt($ch, CURLOPT_ENCODING ,"");
Вы можете использовать заголовок
header('Content-type: text/html; charset=UTF-8');
и после строки декодирования
$page = utf8_decode(curl_exec($ch));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8'); curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
$page = curl_exec($ch); $dom = new DOMDocument('1.0', 'utf-8'); libxml_use_internal_errors(true); @$dom->loadHTML(mb_convert_encoding($page, 'HTML-ENTITIES', 'UTF-8'));
Вы также можете попробовать.
$results = curl_exec($init); curl_close($init); return json_decode(utf8_encode($results));
utf8_encode закодированный символ ASCII. Возврат некодированного ASCII может привести к поломке или возврату ошибки (в моем случае).
$res= curl_exec ( $ch ); $result = iconv("Windows-1251", "UTF-8", $res);