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

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

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

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

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

4b9b3361

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

23
ответ дан 03 февр. '09 в 3:39
источник

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

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!
19
ответ дан 27 февр. '13 в 1:24
источник
Функция

mb_detect_encoding должна быть вашим последним выбором. Это может привести к ошибке WRONG. Команда 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;
}
8
ответ дан 10 марта '15 в 21:58
источник

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

$file = 'your/file.ext'
exec( "from=`file -bi $file | awk -F'=' '{print $2 }'` && iconv -f \$from -t utf-8 $file -o $file" );
1
ответ дан 17 сент. '15 в 12:53
источник

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

//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
}
1
ответ дан 22 апр. '14 в 18:34
источник

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

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

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

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

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

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

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

1
ответ дан 03 февр. '09 в 3:20
источник

Сканирует весь файл, находит любую кодировку из 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;
}
0
ответ дан 16 февр. '17 в 18:08
источник

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

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

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

0
ответ дан 26 июня '13 в 0:30
источник