Обработка расширенного ASCII в загруженных файлах
-
28-09-2019 - |
Вопрос
Сайт, который я недавно завершен с другом, имеет галерею, в которой можно загружать изображения и текстовые файлы. Единственный принятый текстовый файл (для облегчения разработки) .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 символов и используйте их для поиска.