Вопрос

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

Проблемы, которые я встречал, - это одинаково из любого разработчика: расширенный 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_REPLAPE - это общий метод преобразования ужасных умных цитат Microsoft, EM-Dash и эллипсис в их обычные эквиваленты ASCII для вывода.

Этот код отлично работает в условиях, что файл загружена ANSI / US-ASCII.

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

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

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

Любая и вся помощь по этому будет высоко оценено.

Это было полезно?

Решение

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top