O fgetcsv () ignora caracteres especiais quando eles estão no início da linha!

StackOverflow https://stackoverflow.com/questions/2238971

  •  19-09-2019
  •  | 
  •  

Pergunta

Eu tenho um script simples que aceita um arquivo CSV e lê cada linha em uma matriz. Depois, pedalei a cada coluna da primeira linha (no meu caso, ela mantém as perguntas de uma pesquisa) e as imprimi. A pesquisa fica em francês e sempre que o primeiro caráter de uma pergunta é um personagem especial (é, ê, ç, etc) fgetcsv simplesmente omite.

Caracteres especiais no meio do valor não são afetados apenas quando são o primeiro caractere.

Tentei depurar isso, mas estou perplexo. Eu fiz um var_dump com o conteúdo do arquivo e os personagens estão definitivamente lá:

var_dump(utf8_encode(file_get_contents($_FILES['csv_file']['tmp_name'])));

E aqui está o meu código:

if(file_exists($_FILES['csv_file']['tmp_name']) && $csv = fopen($_FILES['csv_file']['tmp_name'], "r"))
    {
        $csv_arr = array();

        //Populate an array with all the cells of the CSV file
        while(!feof($csv))
        {
            $csv_arr[] = fgetcsv($csv);
        }

        //Close the file, no longer needed
        fclose($csv);

        // This should cycle through the cells of the first row (questions)
        foreach($csv_arr[0] as $question)
        {
            echo utf8_encode($question) . "<br />";
        }

    }
Foi útil?

Solução

Você já verificou o Página manual no fgetcsv? Não há nada falando sobre esse problema específico, mas várias contribuições talvez valessem a pena analisar se nada surgir aqui.

Há isso, por exemplo:

Nota: A configuração do local é levada em consideração por esta função. Se o lang for por exemplo, en_us.utf-8, os arquivos na codificação de um bytes serão lidos errados por esta função.

Além disso, visto que está sempre no início da linha, poderia ser que esse seja realmente um problema de quebra de linha oculta? Aí está isso:

NOTA: Se o PHP não estiver reconhecendo adequadamente as extremidades da linha ao ler arquivos ou criados por um computador Macintosh, ativando a opção de configuração de tempo de execução automática_detect_line_endings pode ajudar a resolver o problema.

Você também pode tentar salvar o arquivo com diferentes finais de linha.

Outras dicas

Você está definindo seu local corretamente antes de ligar fgetcsv()?

setlocale(LC_ALL, 'fr_FR.UTF-8');

Por outro lado, fgetcsv() não é seguro de vários bytes.

Certifique -se de defini -lo para algo que apareça na sua lista de locais disponíveis. No Linux (certamente no Debian), você pode ver isso fazendo

locale -a

Você deveria obter algo como ...

C
en_US.utf8
POSIX

Para o UTF8 Suporte, escolha uma codificação com o UTF8 no final. Se a sua entrada for codificada com outra coisa, você precisará usar o local apropriado - mas verifique se o seu sistema operacional o suporta primeiro.

Se você definir o local para um local que não está disponível no seu sistema, ele não o ajudará.

Este comportamento tem um relatório de erro Arquivou -se, mas aparentemente não é um bug.

Vimos o mesmo resultado com LANG definido como C, e contorná -lo, garantindo que esses valores fossem envolvidos em aspas. Por exemplo, a linha

a,"a",é,"é",óú,"óú",ó&ú,"ó&ú"

gera a seguinte matriz quando passada fgetcsv():

array (
  0 => 'a',
  1 => 'a',
  2 => '',
  3 => 'é',
  4 => '',
  5 => 'óú',
  6 => '&ú',
  7 => 'ó&ú',
)

Obviamente, você terá que escapar de quaisquer aspas no valor, dobrando -as, mas isso é muito menos aborrecido do que reparar os personagens ausentes.

Estranhamente, isso acontece com as codificações UTF-8 e CP1252 para o arquivo de entrada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top