Detectar codificação de arquivos em PHP

votos
20

Eu tenho um script que combina uma série de arquivos em um, e ele quebra quando um dos arquivos tem a codificação UTF8. Eu acho que eu deveria estar usando a utf8_decode()função ao ler os arquivos, mas eu não sei como dizer que precisa de decodificação.

Meu código é basicamente:

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

Atualmente, no início de um arquivo UTF8, ele adiciona esses caracteres na saída: 

Publicado 03/02/2009 em 01:14
fonte usuário
Em outras línguas...                            


8 respostas

votos
1

Como você está indo para lidar com os caracteres não-ascii do UTF-8 ou 16 ou 32 arquivo?

Eu pergunto porque eu acho que você pode ter um problema de design aqui.

Gostaria de converter o arquivo de saída em UTF-8 (ou 16 ou 32) em vez do contrário.

Então você não terá esse problema.

Você também considerou as questões de segurança que possam surgir a partir de converter um código UTF8 escapou? Veja este comentário :

Detecção de codificação de multi-byte

Descobrir o que codificar o arquivo de origem está em, em seguida, convertê-lo para UTF-8 e você deve ser bom para ir.

Respondeu 03/02/2009 em 01:20
fonte usuário

votos
24

Tente usar a mb_detect_encodingfunção . Esta função irá examinar a sua corda e tentar "adivinhar" o que sua codificação é. Você pode então convertê-lo como desejado. Como brulak sugeriu , no entanto, você está provavelmente melhor converter para UTF-8 em vez de partir , para preservar os dados que você está transmitindo.

Respondeu 03/02/2009 em 01:39
fonte usuário

votos
19

Para certificar-se de que a saída é UTF-8, não importa que tipo de entrada que era, eu uso essa verificação :

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!
Respondeu 26/02/2013 em 23:24
fonte usuário

votos
1

Eu encontrei recentemente esta questão e a mb_convert_encoding()saída da função foi UTF-8 . Depois de tomar um olhar para os cabeçalhos de resposta, não havia nada de mencionar o tipo de codificação, então eu encontrei Set cabeçalho HTTP para utf-8 php , que propõe o seguinte:

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

Após acrescentando que para o topo do arquivo php, todos os personagens funk foi embora e processado como deveria. Não tenho certeza se esse é o problema o cartaz original foi buscando, mas eu encontrei este na tentativa de resolver o problema de mim e percebi que eu iria partilhar.

Respondeu 25/06/2013 em 22:30
fonte usuário

votos
1

Esta é a minha solução que funcionou como um encanto:

//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
}
Respondeu 22/04/2014 em 16:34
fonte usuário

votos
9

mb_detect_encodingfunção deve ser sua última opção. Isso poderia voltar codificação errada. Comando Linux file -i /path/myfile.txtestá trabalhando muito. No PHP você pode usar:

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;
}
Respondeu 10/03/2015 em 18:58
fonte usuário

votos
1

Para servidores Linux, eu uso este comando:

$file = 'your/file.ext'
exec( "from=`file -bi $file | awk -F'=' '{print $2 }'` && iconv -f \$from -t utf-8 $file -o $file" );
Respondeu 17/09/2015 em 09:53
fonte usuário

votos
1

Verifica todos os arquivos, encontra qualquer tipo de codificação de mb_list_encodings, o bom desempenho ..

    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;
}
Respondeu 16/02/2017 em 15:08
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more