LINUX.ORG.RU

Опеределить кодировку файла и перекодировать в UTF-8

 , ,


0

1

Как опеределить кодировку произвольного файла и при необходимости перекодировать его в UTF-8 (если кодировка другая). В PHP или использовать какую то утилиту через shell_exec? В настоящее время используется код:

$fileContent = file_get_contents($tmpFile);
if (!mb_check_encoding($fileContent, "UTF-8")) {
	$fileContent = utf8_encode($fileContent);
}
file_put_contents($tmpFile, $fileContent);

$fileContent = ""; unset($fileContent);

Однако при больших размерах файлов это расходует много памяти и вызывает ошибку

Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 935157329 bytes)

Перекодировать по частям, правда у utf8 плавающая длина символа в байтах, потому придётся это учитывать.

anonymous ()
Ответ на: комментарий от anonymous

В смысле у входной кодировки так может быть тоже.

anonymous ()
Ответ на: комментарий от Noob_Linux

Как я от него избавлюсь если вы предлагает ф-цию которая в качестве первого же аргумента требует всю строку. Надо ф-цию которая берёт путь к файлу или хотя бы дескриптор от fopen или утилиту типа `convert in.file out.file`.

iluha16 ()
Ответ на: комментарий от iluha16

Считай одну строку и передай её ну и в цикл, в чем проблема?

Noob_Linux ★★★ ()
Ответ на: комментарий от iluha16

Ну вот что-нибудь типо такого совсем не судьба накарябать (не проверял код, писал на память, но основная идея передана):

$out_file = new SplFileObject('my_output_file.txt', 'w');
$file = new SplFileObject('my_input_file.txt');

if(!$file->eof()) {
    $line = $file->current();
    if (!mb_check_encoding($line, "UTF-8")) {
        $converted_line = mb_convert_encoding($line, "UTF-8");
        $out_file->fwrite($converted_line);
        $file->next();
        while (!$file->eof()) {
            $converted_line = mb_convert_encoding($file->current(), "UTF-8");
            $out_file->fwrite($converted_line);
            $file->next();
        }
    }
}
Noob_Linux ★★★ ()
Последнее исправление: Noob_Linux (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.