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

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

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

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

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

utf8_decode должен быть именно вашим utf2iso?!?

BlaM 17.12.2008 16:05

Стоит отметить, что PHP продолжает переходить на utf-8 внутри, поэтому любые строки, которые у вас есть, вероятно, исходят извне. Установите cURL, функции доступа к файлам, потоки, PDO / MySQL или любой другой API для доступа к внешним данным, чтобы использовать UTF-8, чтобы он уже был правильным, когда PHP получит его.

Xeoncross 22.10.2015 22:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
46
2
242 313
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

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

Ответ принят как подходящий

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

utf8_decode — Converts a string with ISO-8859-1 characters encoded with UTF-8 to single-byte ISO-8859-1

utf8_encode — Encodes an ISO-8859-1 string to 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.

Спасибо за хороший ответ, и вы, и остальные здесь правы: utf8_decode (), похоже, выполняет свою работу. Должно быть, были какие-то проблемы с файлами или моим браузером. По крайней мере, я больше не могу воспроизводить ошибки ... (Может, я что-то не так сделал с настройками кодировки браузера?)

qualbeen 17.12.2008 22:01

Для записи: я сталкивался с подобной ситуацией, но я заметил, что iconv был дважды вызван (вложен) в одну и ту же str var. После того, как я удалил тот первый звонок, работает как шарм. (utf8_decode и mb_convert_enconding не используются)

thicolares 09.06.2012 01:31

Этот совет помог мне решить специфическую проблему, когда строка UTF-8 ("Atlántico") сначала была буквально закодирована в ISO-8859-1 (выглядела как "Atlántico"), а затем эти однобайтовые символы были перекодированы обратно в UTF-8 (выглядел так же, как «Atlántico», но на этот раз каждый символ был закодирован в UTF-8). utf8_decode () помог, потому что он декодировал символы UTF-8 в их буквальные заменители ANSI, которые затем каким-то таинственным образом правильно считывались и отображались как символы UTF-8. Есть в этом смысл или нет? Хм..

Tyler 25.10.2012 05:19

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

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

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

iconv или mb_convert_encoding? iconv требует знания входной кодировки, что может быть не так.

Benubird 28.04.2016 15:34

@Benubird. Если вы угадываете кодировку, вы, вероятно, столкнетесь с еще более серьезными проблемами (теперь это нелегко воспроизвести, так как это может зависеть от частоты символов). Но вы правы, mb_convert_encoding определенно относится к этому ответу. Добавлен.

phihag 28.04.2016 16:01

«Избегайте кодирования, отличного от UTF8» - в целом хороший совет, но иногда это невозможно. Например, мы пытаемся заставить работать стороннюю интеграцию, когда сторона требует XML в формате Latin 1.

GordonM 10.03.2017 18:30

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

function utf8_to_html ($data) {
    return preg_replace(
        array (
            '/ä/',
            '/ö/',
            '/ü/',
            '/é/',
            '/à/',
            '/è/'
        ),
        array (
            'ä',
            'ö',
            'ü',
            'é',
            'à',
            'è'
        ),
        $data 
    );
}

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

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

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

Пожалуйста, попробуйте добавить некоторые пояснения к коду, чтобы повысить образовательную ценность сообщения.

Toon Krijthe 07.12.2012 17:11

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

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

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

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

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

Намного лучше использовать

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

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

Для всех, кто использует это решение, имейте в виду, что функция на самом деле mb_convert_encoding.

b4tch 21.10.2020 18:06

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

Другие вопросы по теме