Обработка расширенного ASCII при загрузке файлов

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

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

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

$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, но ни замена умных кавычек не работает, ни веб-браузер не отображает их правильно.

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


person Navarr    schedule 19.06.2010    source источник


Ответы (2)


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

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

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

person Artefacto    schedule 19.06.2010
comment
На самом деле проблема заключалась в том, что mb_convert($string,UTF-8); на самом деле портит синтаксис, если вы передаете ему строку UTF-8. Он не может преобразовать UTF-8 в UTF-8 без ужасных результатов. - person Navarr; 24.06.2010

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

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

person Stephen Chu    schedule 19.06.2010