Преобразовать utf8-символы в iso-88591 и обратно в PHP

Некоторые из моих скриптов используют другую кодировку, и когда я пытаюсь их объединить, это становится проблемой.

Но я не могу изменить кодировку, которую они используют, вместо этого я хочу изменить кодировку результата из сценария A и использовать ее в качестве параметра в сценарии B.

Итак: есть ли простой способ изменить строку с UTF-8 на ISO-88591 в PHP? Я просмотрел utf_encode и _decode, но они не делают то, что я хочу. Почему не существует функции "utf2iso()" или подобной?

Я не думаю, что у меня есть символы, которые нельзя записать в формате ISO, так что это не должно быть большой проблемой.


person qualbeen    schedule 17.12.2008    source источник
comment
utf8_decode точно должен быть вашим utf2iso?!?   -  person BlaM    schedule 17.12.2008
comment
Стоит отметить, что PHP продолжает переходить на utf-8 внутри, поэтому любые строки, которые у вас есть, вероятно, поступают извне. Установите cURL, функции доступа к файлам, потоки, PDO/MySQL или любой другой API для доступа к внешним данным для использования UTF-8, чтобы он уже был правильным, когда PHP его получит.   -  person Xeoncross    schedule 22.10.2015


Ответы (10)


Взгляните на iconv() или mb_convert_encoding(). Кстати: почему бы не использовать utf8_encode() и utf8_decode() вам подходит?

utf8_decode — преобразует строку с символами ISO-8859-1, закодированными с помощью UTF-8, в однобайтовые символы ISO-8859-1.

utf8_encode — кодирует строку ISO-8859-1 в UTF-8.

Так что по существу

$utf8 = 'ÄÖÜ'; // file must be UTF-8 encoded
$iso88591_1 = utf8_decode($utf8);
$iso88591_2 = iconv('UTF-8', 'ISO-8859-1', $utf8);
$iso88591_2 = mb_convert_encoding($utf8, 'ISO-8859-1', 'UTF-8');

$iso88591 = 'ÄÖÜ'; // file must be ISO-8859-1 encoded
$utf8_1 = utf8_encode($iso88591);
$utf8_2 = iconv('ISO-8859-1', 'UTF-8', $iso88591);
$utf8_2 = mb_convert_encoding($iso88591, 'UTF-8', 'ISO-8859-1');

все должны делать то же самое - с utf8_en/decode() не требующим специального расширения, mb_convert_encoding() требующим ext/mbstring и iconv() требующим ext/iconv.

person Stefan Gehrig    schedule 17.12.2008
comment
Спасибо за хороший ответ, и вы, и другие здесь правы: utf8_decode(), похоже, выполняет свою работу. Должно быть, были какие-то проблемы с файлами или моим браузером. По крайней мере, я больше не могу воспроизводить ошибки... (Может быть, я сделал что-то не так с настройками браузера-кодировки?) - person qualbeen; 17.12.2008
comment
Просто для протокола: я сталкивался с такой ситуацией, но я заметил, что iconv дважды вызывался (вложенный) в одну и ту же переменную str. После того, как я удалил этот первый вызов, он работает как шарм. (utf8_decode и mb_convert_enconding не использовались) - person thicolares; 09.06.2012
comment
Этот совет помог мне решить своеобразную проблему, когда строка UTF-8 (Atlántico) была сначала буквально закодирована в ISO-8859-1 (выглядела как Atlántico), а затем эти однобайтовые символы были перекодированы обратно в UTF-8 ( выглядел точно так же, как Atlántico, но на этот раз каждый символ был закодирован в UTF-8). utf8_decode() помог, потому что он декодировал символы UTF-8 в их буквальные замены ANSI, которые затем каким-то загадочным образом правильно читались и отображались как символы UTF-8. Есть смысл или нет? Хм.. - person Tyler; 25.10.2012

Прежде всего, не используйте разные кодировки. Это приводит к беспорядку, и UTF-8 определенно следует использовать везде.

Скорее всего, вы вводите не ISO-8859-1, а что-то другое (ISO-8859-15, Windows-1252). Чтобы преобразовать их, используйте iconv или mb_convert_encoding.

Тем не менее, utf8_encode и utf8_decode должны работать для ISO-8859-1. Было бы неплохо, если бы вы разместили ссылку на файл или uuencoded. или base64 пример строки, для которой преобразование завершается неудачно или приводит к неожиданным результатам.

person phihag    schedule 17.12.2008
comment
iconv или mb_convert_encoding? iconv требует знания входной кодировки, что может быть не так. - person Benubird; 28.04.2016
comment
@Benubird Если вы угадываете кодировку, вы, вероятно, столкнетесь с еще более серьезными проблемами (теперь это нелегко воспроизвести, поскольку это может зависеть от частоты символов). Но вы правы, mb_convert_encoding определенно относится к этому ответу. Добавлен. - person phihag; 28.04.2016
comment
Избегайте любой кодировки, кроме UTF8, в целом хороший совет, но иногда это невозможно. Например, мы пытаемся заставить стороннюю интеграцию работать там, где сторона требует XML в формате Latin 1. - person GordonM; 10.03.2017

Гораздо лучше использовать

$value = mb_convert_encode($value,'HTML-ENTITIES','UTF-8');

Особенно, когда вы используете вызов AJAX для отправки символов «ISO-8859-1». Он работает для китайского, японского, чешского, немецкого и многих других языков.

person VINAY KANT    schedule 21.06.2017
comment
Для всех, кто использует это решение, имейте в виду, что функция на самом деле mb_convert_encoding - person b4tch; 21.10.2020

Используйте html_entity_decode() и htmlentities().

$html = html_entity_decode(htmlentities($html, ENT_QUOTES, 'UTF-8'), ENT_QUOTES , 'ISO-8859-1');

htmlentities() форматирует ввод в UTF8, а html_entity_decode() обратно в ISO-8859-1.

person Fernando CR    schedule 14.10.2017

установить метатег в голове как

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

используйте ссылку http://www.i18nqa.com/debug/utf8-debug.html для замены нужных символов.

затем используйте str_replace как

    $find = array('“', '’', '…', '—', '–', '‘', 'é', 'Â', '•', 'Ëœ', 'â€'); // en dash
                        $replace = array('“', '’', '…', '—', '–', '‘', 'é', '', '•', '˜', '”');
$content = str_replace($find, $replace, $content);

Это метод, который я использую, и он мне очень помогает. Спасибо!

person user2842936    schedule 24.01.2014

Вам нужно использовать пакет icon, а именно его функцию iconv.

person Martin v. Löwis    schedule 17.12.2008

Я использую эту функцию:

function formatcell($data, $num, $fill=" ") {
    $data = trim($data);
    $data=str_replace(chr(13),' ',$data);
    $data=str_replace(chr(10),' ',$data);
    // translate UTF8 to English characters
    $data = iconv('UTF-8', 'ASCII//TRANSLIT', $data);
    $data = preg_replace("/[\'\"\^\~\`]/i", '', $data);


    // fill it up with spaces
    for ($i = strlen($data); $i < $num; $i++) {
        $data .= $fill;
    }
    // limit string to num characters
   $data = substr($data, 0, $num);

    return $data;
}


echo formatcell("YES UTF8 String Zürich", 25, 'x'); //YES UTF8 String Zürichxxx
echo formatcell("NON UTF8 String Zurich", 25, 'x'); //NON UTF8 String Zurichxxx

Проверьте мою функцию в моем блоге http://www.unexpectedit.com/php/php-handling-non-english-characters-utf8

person Ignacio Pascual    schedule 31.08.2010

Я использовал:

function utf8_to_html ($data) {
    return preg_replace(
        array (
            '/ä/',
            '/ö/',
            '/ü/',
            '/é/',
            '/à/',
            '/è/'
        ),
        array (
            '&auml;',
            '&ouml;',
            '&uuml;',
            '&eacute;',
            '&agrave;',
            '&egrave;'
        ),
        $data 
    );
}
person Community    schedule 13.09.2009

В моем случае после загрузки файлов с именами, содержащими эти символы, они даже не были видны Filezilla! В файловом менеджере Cpanel они показывались с ? (под черным фоном). И эта комбинация заставила его правильно отображаться в браузере (HTML-документ имеет западную кодировку):

$dspFileName = utf8_decode(htmlspecialchars(iconv(mb_internal_encoding(), 'utf-8', basename($thisFile['path']))) );
person user109764    schedule 30.11.2016

person    schedule
comment
Пожалуйста, попробуйте добавить некоторые пояснения к коду, чтобы повысить образовательную ценность поста. - person Toon Krijthe; 07.12.2012