Конвертируйте utf8-символы в iso-88591 и обратно в PHP - PullRequest
41 голосов
/ 17 декабря 2008

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

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

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

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

Ответы [ 10 ]

114 голосов
/ 17 декабря 2008

Посмотрите на 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.

6 голосов
/ 17 декабря 2008

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

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

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

1 голос
/ 21 июня 2017

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

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

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

1 голос
/ 24 января 2014

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

 <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);

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

0 голосов
/ 14 октября 2017

Используйте 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.

0 голосов
/ 01 декабря 2016

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

$dspFileName = utf8_decode(htmlspecialchars(iconv(mb_internal_encoding(), 'utf-8', basename($thisFile['path']))) );
0 голосов
/ 07 декабря 2012
function parseUtf8ToIso88591(&$string){
     if(!is_null($string)){
            $iso88591_1 = utf8_decode($string);
            $iso88591_2 = iconv('UTF-8', 'ISO-8859-1', $string);
            $string = mb_convert_encoding($string, 'ISO-8859-1', 'UTF-8');       
     }
}
0 голосов
/ 31 августа 2010

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

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

0 голосов
/ 13 сентября 2009

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

function utf8_to_html ($data) {
    return preg_replace(
        array (
            '/ä/',
            '/ö/',
            '/ü/',
            '/é/',
            '/à/',
            '/è/'
        ),
        array (
            '&auml;',
            '&ouml;',
            '&uuml;',
            '&eacute;',
            '&agrave;',
            '&egrave;'
        ),
        $data 
    );
}
0 голосов
/ 17 декабря 2008

Вам необходимо использовать пакет iconv , в частности его функцию iconv.

...