Перекодировка текста UTF-8 и WINDOWS-1251

Проблема кодировок часто возникает при написании парсеров, чтении данных из xml и CSV файлов. Ниже представлены способы эту проблему решить.

1
$text = iconv('windows-1251//IGNORE', 'UTF-8//IGNORE', $text);
echo $text;
PHP
$text = mb_convert_encoding($text, 'UTF-8', 'windows-1251');
echo $text;
PHP
2
$text = iconv('utf-8//IGNORE', 'windows-1251//IGNORE', $text);
echo $text;
PHP
$text = mb_convert_encoding($text, 'windows-1251', 'utf-8');
echo $text;
PHP
3
$text = iconv('utf-8//IGNORE', 'cp1252//IGNORE', $text);
$text = iconv('cp1251//IGNORE', 'utf-8//IGNORE', $text);
echo $text;
PHP

Иногда доходит до бреда, но работает:

$text = iconv('utf-8//IGNORE', 'windows-1251//IGNORE', $text);
$text = iconv('windows-1251//IGNORE', 'utf-8//IGNORE', $text);
echo $text;
PHP
4

Бывают случаи когда file_get_contents() или CURL возвращают иероглифы (Алмазные борÑ) – причина тут не в кодировке, а в отсутствии BOM-метки.

$text = file_get_contents('https://example.com');
$text = "\xEF\xBB\xBF" .  $text;
echo $text;
PHP

Ещё бывают случаи, когда file_get_contents() возвращает текст в виде:

�mw�Ƒ0�����&IkAI��f��j4/{�</�&�h�� ��({�񌝷o�����:/��<g���g��(�=�9�Paɭ

Это сжатый текст в 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');
PHP
12.01.2017, обновлено 02.11.2021
74677

Комментарии 3

Bahtiyar Abdukarimov Bahtiyar Abdukarimov
3 апреля 2021 в 01:19
Просто нет слов, сложно выразить эмоции без мата, ибо я уже почти 6 часов над этой проблемой сидел, столько ссылок по кодировкам перекопал, а тут вот оно что, нет BOM-метки. Просто огромное человеческое спасибо за этот пост.
bolod bolod
6 ноября 2022 в 16:59
Привет, 3-е суток ломал голову, разрабам сервера писал почему json c выше 200 символов меняет отдачу типа:(�mw�Ƒ0�����&IkAI��f��j4/{�</�&�h�� ��({�񌝷o�����:/��<g���g��(�=�9�Paɭ). Отвечали всякую фигню.
Все перелопатил, а тут !!!!!!!!!!!!!!
ГОЛОВА.
Автор публикуй больше подобных тонкостей в PHP, для нас любителей это как глоток воды в пустыне!!!
bolod bolod
7 ноября 2022 в 15:11
Добрый день, можете помочь: как динамическое int число 1648249640 показать как время ( оно же отображается ка 05 час :25 мин: 37 сек), у меня не выходит добиться результата, получается совершенно другое время с данного числа.
Спасибо!

, чтобы добавить комментарий.

Другие публикации

Отправка письма с вложением
Отправка e-mail в кодировке UTF-8 с вложенными файлами и возможные проблемы.
12100
+3
Работа с JSON в PHP
JSON (JavaScript Object Notation) – текстовый формат обмена данными, основанный на JavaScript, который представляет собой набор пар {ключ: значение}. Значение может быть массивом, числом, строкой и...
114111
+15
Массив $_SERVER
Описание значений глобального массива $_SERVER с примерами.
52421
+3
Получить фото из Instagram без API
Так как Instagram и Fasebook ограничили доступ к API, а фото с открытого аккаунта всё же нужно периодически получать и...
24688
+7
Обзор PHP расширений для чтения файлов Excel
В статье представлены различные PHP-расширения для чтения файлов XLS, XLSX, описаны их плюсы и минусы, а также примеры...
56829
+2
Бот Телеграм на PHP
Примеры как зарегистрировать бота в Телеграм, описание и взаимодействие с основными методами API.
141290
+44