Функция PHP iconv кодировка символов от iso-8859-1 до utf-8 - PullRequest
2 голосов
/ 02 сентября 2010

Я пытаюсь преобразовать строку из iso-8859-1 в utf-8. Но когда я нахожу эти два символа € и • функция возвращает символ, представляющий собой квадрат с двумя числами внутри.

Как я могу решить эту проблему?

Ответы [ 4 ]

8 голосов
/ 02 сентября 2010

Я думаю, вам нужна кодировка Кодовая страница Windows 1252 (западноевропейская). Это не то же самое, что ISO-8859-1 (или 8859-15 в этом отношении); символы в диапазоне 0xA0-0xFF соответствуют 8859-1, но cp1252 добавляет ассортимент дополнительных символов в диапазоне 0x80-0x9F, где ISO-8859-1 назначает малоиспользуемые контрольные коды.

Путаница возникает из-за того, что когда вы обслуживаете страницу как text/html;charset=iso-8859-1, по историческим причинам браузеры на самом деле используют cp1252 (и, следовательно, будут также отправлять формы в cp1252).

iconv('cp1252', 'utf-8', "\x80 and \x95")
-> "\xe2\x82\xac and \xe2\x80\xa2"
1 голос
/ 24 апреля 2014

Всегда сначала проверяйте кодировку!Вы никогда не должны слепо доверять своей кодировке (даже если она с вашего собственного сайта!):

function convert_cp1252_to_utf8($input, $default = '') {
    if ($input === null || $input == '') {
        return $default;
    }

    // https://en.wikipedia.org/wiki/UTF-8
    // https://en.wikipedia.org/wiki/ISO/IEC_8859-1
    // https://en.wikipedia.org/wiki/Windows-1252
    // http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT
    $encoding = mb_detect_encoding($input, array('Windows-1252', 'ISO-8859-1'), true);
    if ($encoding == 'ISO-8859-1' || $encoding == 'Windows-1252') {
        /*
         * Because ISO-8859-1 and CP1252 are identical except for 0x80 through 0x9F
         * and control characters, always convert from Windows-1252 to UTF-8.
         */
        $input = iconv('Windows-1252', 'UTF-8//IGNORE', $input);
    }
    return $input;
}
0 голосов
/ 02 сентября 2010

Эти 2 символа недопустимы в iso-8859-1 (вы имели в виду iso-8859-15?)

$ php -r 'echo iconv("utf-8","iso-8859-1//TRANSLIT","ter € and • the");'
ter EUR and o the
0 голосов
/ 02 сентября 2010

iso-8859-1 не содержит знак €, поэтому ваша строка не может быть интерпретирована с iso-8859-1, если она его содержит. Вместо этого используйте iso-8859-15.

...