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