Обработка расширенного ASCII при загрузке файлов - PullRequest
0 голосов
/ 19 июня 2010

На сайте, который я недавно создал вместе с другом, есть галерея, в которую можно загружать изображения и текстовые файлы.Единственный приемлемый текстовый файл (для упрощения разработки) - это .txt, который обычно работает без помех (или нет).

Проблемы, с которыми я столкнулся, те же, что и у любого разработчика: Extended ASCII от Microsoft.

Перед выводом текста из файла я перебираю несколько разных слоев, чтобы попытаться очистить его:

$txtfile = file_get_contents(".".$this->var['submission']['file_loc']);

// BOM Fun
    $boms = array
    (
        "utf8"    => array(3,pack("CCC",0xEF,0xBB,0xBF)),
        "utf16be"       => array(2,pack("CC",0xFE,0xFF)),
        "utf16le"       => array(2,pack("CC",0xFF,0xFE)),
        "utf32be"       => array(4,pack("CCCC",0x00,0x00,0xFE,0xFF)),
        "utf32le"       => array(4,pack("CCCC",0xFF,0xFE,0x00,0x00)),
        "gb18030"       => array(4,pack("CCCC",0x84,0x31,0x95,0x33))
    );
    foreach($boms as $bom)
    {
        if(mb_substr($txtfile,0,$bom[0]) == $bom[1])
        {
            $txtfile = substr($txtfile,$bom[0]);
            break;
        }
    }
$txtfile_o = $txtfile;
$badwords = array(chr(145),chr(146),chr(147),chr(148),chr(151),chr(133));
$fixwords = array("'","'",'"','"','-','...');
$txtfile_o = str_replace($badwords,$fixwords,$txtfile_o);
$txtfile_o = mb_convert_encoding($txtfile_o,"UTF-8");

str_replace - это общий метод преобразования ужасных умных цитат Microsoft, то естьтире и многоточие в их нормальные эквиваленты ASCII для вывода.

Этот код отлично работает при условии, что загруженный файл является ANSI / us-ascii.

Этот код не работает (длябез особой причины), когда загруженный файл имеет формат UTF-8.

Если файл имеет формат UTF-8, просмотр самого файла в веб-браузере работает нормально, но распечатка его через веб-интерфейс с использованием этого кода делаетне.В этом случае умные цитаты становятся своего рода акцентированным персонажем.

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

Любая помощь по этому вопросу будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 19 июня 2010

Если я правильно понимаю, ваша проблема в том, что ваш код, который заменяет символы «расширенный ASCII» для их аналогов ASCII, завершается ошибкой, когда пользователь отправляет файл в UTF-8.

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

Что бы я порекомендовал вам сделать, это использовать некоторую эвристику, чтобы определить, закодирован ли файл в UTF-8 (BOM - хороший способ, если вы уверены, что он будет присутствовать) или Windows-1252 что угодно, а затем преобразовать его в UTF-8, если это не так. В этом случае вам не нужно будет заменять какие-либо символы, вы можете сохранить умные кавычки.

0 голосов
/ 19 июня 2010

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

Найдите последовательности символов UTF8 и используйте их для поиска.

...