проблемы с кодировкой php utf-8 - PullRequest
1 голос
/ 04 марта 2011

Привет всем: я столкнулся с непростой проблемой: мне нужно прочитать некоторые файлы и преобразовать их содержимое в некоторые файлы XML.Я полагаю, что для каждой строки в файле большинство из них являются действительным кодом ASCII, так что я мог просто прочитать строку в php и сохранить строку в файл XML с кодировкой XML по умолчанию «UTF-8».Тем не менее, я заметил, что в исходных файлах могут быть некоторые GBK, GB2312 (китайский символ), SJIS (японские символы) и т. Д., У php нет проблем с сохранением строки в XML напрямую.Тем не менее, анализатор XML обнаружит, что есть недопустимые коды UTF-8 и произошел сбой.

Теперь я думаю, что лучшей библиотечной функцией php для моих целей, вероятно, является:

 $decode_str = mb_convert_encoding($str, 'UTF-8', 'auto');

Я пытаюсь запустить эту функцию диалога для каждой строки перед вставкой в ​​XML.Однако, как я тестировал с некоторыми кодировками UTF-16 и GBK, я не думаю, что эта функция могла бы правильно различать схему кодирования входной строки.

Кроме того, я попытался использовать CDATA для переноса строки, этостранно, что синтаксический анализатор XML по-прежнему жалуется на недопустимые коды UTF-8 и т. д. Конечно, когда я собираю файл xml, то внутри CDATA наверняка беспорядок.

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 04 марта 2011

Я трачу один раз много времени на создание безопасной функции кодирования UTF8 :

function _convert($content) {
    if(!mb_check_encoding($content, 'UTF-8')
        OR !($content === mb_convert_encoding(mb_convert_encoding($content, 'UTF-32', 'UTF-8' ), 'UTF-8', 'UTF-32'))) {

        $content = mb_convert_encoding($content, 'UTF-8');

        if (mb_check_encoding($content, 'UTF-8')) {
            // log('Converted to UTF-8');
        } else {
            // log('Could not be converted to UTF-8');
        }
    }
    return $content;
}

Основная проблема заключалась в том, чтобы выяснить, какое кодирование входная строка уже использует.Скажите, пожалуйста, подходит ли вам и мое решение!

0 голосов
/ 04 марта 2011

Я столкнулся с этой проблемой при использовании json_encode.Я использую это, чтобы получить все в utf8.Источник: http://us2.php.net/manual/en/function.json-encode.php

function ascii_to_entities($str) 
    { 
       $count    = 1; 
       $out    = ''; 
       $temp    = array(); 

       for ($i = 0, $s = strlen($str); $i < $s; $i++) 
       { 
           $ordinal = ord($str[$i]); 

           if ($ordinal < 128) 
           { 
                if (count($temp) == 1) 
                { 
                    $out  .= '&#'.array_shift($temp).';'; 
                    $count = 1; 
                } 

                $out .= $str[$i]; 
           } 
           else 
           { 
               if (count($temp) == 0) 
               { 
                   $count = ($ordinal < 224) ? 2 : 3; 
               } 

               $temp[] = $ordinal; 

               if (count($temp) == $count) 
               { 
                   $number = ($count == 3) ? (($temp['0'] % 16) * 4096) + 
(($temp['1'] % 64) * 64) + 
($temp['2'] % 64) : (($temp['0'] % 32) * 64) + 
($temp['1'] % 64); 

                   $out .= '&#'.$number.';'; 
                   $count = 1; 
                   $temp = array(); 
               } 
           } 
       } 

       return $out; 
    } 
...