iconv
Преобразует набор символов строки str из кодировки in_charset в out_charset .
Список параметров
Требуемая на выходе кодировка.
Если добавить к out_charset строку //TRANSLIT, включается режим транслитерации. Это значит, что в случае, если символ не может быть представлен в требуемой кодировке, он будет заменен на один или несколько нескольких наиболее близких по внешнему виду символов. Если добавить строку //IGNORE, то символы, которые не могут быть представлены в требуемой кодировке, будут удалены. В случае отсутствия вышеуказанных параметров при наличии некорректных символов строка str будет обрезана до первого такого символа, и будет сгенерирована ошибка уровня E_NOTICE .
Строка, которую необходимо преобразовать.
Возвращаемые значения
Возвращает преобразованную строку или FALSE в случае возникновения ошибки.
Примеры
Пример #1 Пример использования iconv()
echo ‘Original : ‘ , $text , PHP_EOL ;
echo ‘TRANSLIT : ‘ , iconv ( «UTF-8» , «ISO-8859-1//TRANSLIT» , $text ), PHP_EOL ;
echo ‘IGNORE : ‘ , iconv ( «UTF-8» , «ISO-8859-1//IGNORE» , $text ), PHP_EOL ;
echo ‘Plain : ‘ , iconv ( «UTF-8» , «ISO-8859-1» , $text ), PHP_EOL ;
Результатом выполнения данного примера будет что-то подобное:
Original : This is the Euro symbol '€'. TRANSLIT : This is the Euro symbol 'EUR'. IGNORE : This is the Euro symbol ''. Plain : Notice: iconv(): Detected an illegal character in input string in .\iconv-example.php on line 7 This is the Euro symbol '
Перекодировка текста 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');
Смотрите также
This is edited functions utf8_to_cp1251 and cp1251_to_utf8.
Changes: Check current string encoding.
function cp1251_to_utf8 ( $s )
<
if (( mb_detect_encoding ( $s , ‘UTF-8,CP1251’ )) == «WINDOWS-1251» )
<
$c209 = chr ( 209 ); $c208 = chr ( 208 ); $c129 = chr ( 129 );
for( $i = 0 ; $i < strlen ( $s ); $i ++)
<
$c = ord ( $s [ $i ]);
if ( $c >= 192 and $c elseif ( $c > 239 ) $t .= $c209 . chr ( $c — 112 );
elseif ( $c == 184 ) $t .= $c209 . $c209 ;
elseif ( $c == 168 ) $t .= $c208 . $c129 ;
else $t .= $s [ $i ];
>
return $t ;
>
else
<
return $s ;
>
>
function utf8_to_cp1251 ( $s )
<
if (( mb_detect_encoding ( $s , ‘UTF-8,CP1251’ )) == «UTF-8» )
<
for ( $c = 0 ; $c < strlen ( $s ); $c ++)
<
$i = ord ( $s [ $c ]);
if ( $i if ( $byte2 )
<
$new_c2 =( $c1 & 3 )* 64 +( $i & 63 );
$new_c1 =( $c1 >> 2 )& 5 ;
$new_i = $new_c1 * 256 + $new_c2 ;
if ( $new_i == 1025 )
<
$out_i = 168 ;
> else <
if ( $new_i == 1105 )
<
$out_i = 184 ;
> else <
$out_i = $new_i — 848 ;
>
>
$out .= chr ( $out_i );
$byte2 = false ;
>
if (( $i >> 5 )== 6 )
<
$c1 = $i ;
$byte2 = true ;
>
>
return $out ;
>
else
<
return $s ;
>
>
?>
If you need convert string from Windows-1251 to 866. Some characters of 1251 haven’t representation on DOS 866. For example, long dash — chr(150) will be converted to 0, after that iconv finish his work and other charactes will be skiped. Problem characters range in win1251 (128-159,163,165-167,169,171-174,177-182,187-190).
//$text — input text in windows-1251
//$cout — output text in 866 (cp866, dos ru ascii)
Конвертация кодировок utf-8 и win-1251 в PHP через iconv
Обычно php страница или сайт имеет одну базовую кодировку. Я работаю только с UTF-8, но бывают случаи, когда приходится использовать какой-нибудь php файл с кодировкой win-1251, а передаваемые в него значения идут в кодировке UTF-8. В этом случае после исполнения скрипта появляются кракозябры.
Таких ситуаций может быть множество, например, при использовании функции отправки сообщений mail(), работе с PDF обработкой или даже при различных действиях с БД. В идеале нужно обязательно избавляться от таких хвостов и не допускать в коде функции конвертации, но если это просто невозможно, то на помощь вам придет функция iconv.
Синтаксис функции: $string= iconv(‘начальная кодировка’, ‘конечная кодировка’, $string);
Здесь $string — строка, кодировку которой мы изменяем
Из этого выходит, что для того, чтобы преобразовать строку из кодировки utf-8 в win-1251 нужно писать следующее: $string= iconv(‘utf-8’, ‘win-1251’, $string);
Из win-1251 в utf-8: $string= iconv(‘win-1251’, ‘utf-8’, $string);
На заметку, помните, что кодировку в php странице можно указывать за счет установки header-а документа. Например, если ваша страница в UTF-8 без BOM, то в самом начале документа ставьте: . Если же windows 1251, то сам документ должен быть в ANSI, а в первой строке можете поставить: . Иногда эти манипуляции помогают с письмами, которые приходят в кракозябрах из-за неверной кодировки.