Intereting Posts
Как преобразовать логическое значение в строку Проверить несколько значений php array Как изменить внешний вид URL-адреса из PHP-скрипта изменить цвет кнопки на клик и оставаться таким же для остальной части времени? создание пользовательского управления с использованием php mysql Объединить 2 массива объектов в PHP Codeigniter ActiveRecord: присоединиться к обратному обращению Как удалить элемент из дерева XML, где атрибут – это определенная строка в Simple XML PHP Каков наилучший способ взглянуть на экземпляр (объект) класса PHP, чтобы увидеть все доступные ему публичные свойства и методы? PHP не может запускать функции MYSQLI на микро-экземпляре Amazon EC2 INSERT INTO … ON DUPLICATE UPDATE все значения Нужен ли RedBean первичный ключ «id»? phpmyadmin – по умолчанию вместо структуры Показывать подкатегорию вместо Root в меню Невозможно заставить PHP PDT xDebug остановиться на контрольных точках в Eclipse

Обнаружение кодировки файлов в PHP

У меня есть скрипт, который объединяет несколько файлов в один, и он ломается, когда один из файлов имеет кодировку UTF8. Я полагаю, что при чтении файлов я должен использовать utf8_decode() , но я не знаю, как определить, какая необходимость декодировать.

Мой код в основном:

 $output = ''; foreach ($files as $filename) { $output .= file_get_contents($filename) . "\n"; } file_put_contents('combined.txt', $output); 

В настоящее время, в начале файла UTF8, он добавляет эти символы в вывод: 

Попробуйте использовать функцию mb_detect_encoding . Эта функция проверит вашу строку и попытается «угадать», что такое ее кодировка. Затем вы можете преобразовать его по желанию. Однако, как предположил Брулак , вам, вероятно, лучше перейти на UTF-8, а не на сохранение данных, которые вы передаете.

Чтобы убедиться, что выход UTF-8, независимо от того, какой вход он был, я использую эту проверку :

 if(!mb_check_encoding($output, 'UTF-8') OR !($output === mb_convert_encoding(mb_convert_encoding($output, 'UTF-32', 'UTF-8' ), 'UTF-8', 'UTF-32'))) { $output = mb_convert_encoding($content, 'UTF-8', 'pass'); } // $output is now safely converted to UTF-8! 

Функция mb_detect_encoding должна быть вашим последним выбором. Это может привести к ошибке WRONG. file -i /path/myfile.txt командной file -i /path/myfile.txt Linux file -i /path/myfile.txt работает отлично. В PHP вы можете использовать:

 function _detectFileEncoding($filepath) { // VALIDATE $filepath !!! $output = array(); exec('file -i ' . $filepath, $output); if (isset($output[0])){ $ex = explode('charset=', $output[0]); return isset($ex[1]) ? $ex[1] : null; } return null; } 

Как вы собираетесь обрабатывать символы не-ascii из файлов UTF-8 или 16 или 32?

Я спрашиваю, потому что я думаю, что у вас может быть проблема с дизайном.

Я бы преобразовал ваш выходной файл в UTF-8 (или 16 или 32), а не наоборот.

Тогда у вас не будет этой проблемы.

Вы также рассмотрели проблемы безопасности, которые могут возникнуть при преобразовании кода с экранированным кодом UTF8? Смотрите этот комментарий :

Обнаружение многобайтовой кодировки

Выясните, какая кодировка вашего исходного файла находится, а затем конвертируйте ее в UTF8, и вам должно быть хорошо идти.

Это мое решение, которое работает как шарм:

 //check string strict for encoding out of list of supported encodings $enc = mb_detect_encoding($str, mb_list_encodings(), true); if ($enc===false){ //could not detect encoding } else if ($enc!=="UTF-8"){ $str = mb_convert_encoding($str, "UTF-8", $enc); } else { //UTF-8 detected } 

Для серверов linux я использую эту команду:

 $file = 'your/file.ext' exec( "from=`file -bi $file | awk -F'=' '{print $2 }'` && iconv -f \$from -t utf-8 $file -o $file" ); 

Я недавно столкнулся с этой проблемой, а mb_convert_encoding() функции mb_convert_encoding() был UTF-8 . После просмотра заголовков ответов не было никакого упоминания о типе кодирования, поэтому я нашел Set http header для utf-8 php , который предлагает следующее:

 <?php header('Content-Type: text/html; charset=utf-8'); 

Добавив это в начало файла php, все фанки-персонажи ушли и отобразились как следует. Не уверен, что это проблема, которую искал оригинальный плакат, но я нашел это, пытаясь решить проблему сам и подумал, что я поделюсь.

Сканирует весь файл, находит любую кодировку из mb_list_encodings, хорошую производительность.

  function detectFileEncoding($filePath){ $fopen=fopen($filePath,'r'); $row = fgets($fopen); $encodings = mb_list_encodings(); $encoding = mb_detect_encoding( $row, "UTF-8, ASCII, Windows-1252, Windows-1254" );//these are my favorite encodings if($encoding !== false) { $key = array_search($encoding, $encodings) !== false; if ($key !== false) unset($encodings[$key]); $encodings = array_values($encodings); } $encKey = 0; while ($row = fgets($fopen)) { if($encoding == false){ $encoding = $encodings[$encKey++]; } if(!mb_check_encoding($row, $encoding)){ $encoding =false; rewind($fopen); } } return $encoding; } не  function detectFileEncoding($filePath){ $fopen=fopen($filePath,'r'); $row = fgets($fopen); $encodings = mb_list_encodings(); $encoding = mb_detect_encoding( $row, "UTF-8, ASCII, Windows-1252, Windows-1254" );//these are my favorite encodings if($encoding !== false) { $key = array_search($encoding, $encodings) !== false; if ($key !== false) unset($encodings[$key]); $encodings = array_values($encodings); } $encKey = 0; while ($row = fgets($fopen)) { if($encoding == false){ $encoding = $encodings[$encKey++]; } if(!mb_check_encoding($row, $encoding)){ $encoding =false; rewind($fopen); } } return $encoding; }