2010-06-19 3 views
0

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

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

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

ответ

1

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

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

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

+0

Проблема заключалась в том, что mb_convert ($ string, "UTF-8"); на самом деле затягивает синтаксис, если вы передаете ему строку UTF-8. Он не может преобразовать UTF-8 в UTF-8 без ужасных результатов. – Navarr

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^