Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Criando um filtro com o utf8_decode

Olá professor, tentei criar o filtro com o utf8_decode, segue o código:

DecodeFiltro.php:

<?php 

class DecodeFiltro extends php_user_filter{
    public $stream;

    public function onCreate()
    {
        $this->stream = fopen('php://temp', 'w+');
        return $this->stream !== false;
    }

    public function filter($in, $out, &$consumed, $closing)
    {
        $saida = '';

        while($bucket = stream_bucket_make_writeable($in)){
            $lines = explode("\n", $bucket->data);
            foreach($lines as $line){
                $saida .= utf8_decode("$line\n");
            }
        }

        $bucketSaida = stream_bucket_new($this->stream, $saida);
        stream_bucket_append($out, $bucketSaida);

        return PSFS_PASS_ON;
    }
}

implementacaoFiltroDecode.php:

<?php

require 'DecodeFiltro.php';

$file = fopen('cursos.csv', 'r');
stream_filter_register('file.decode', DecodeFiltro::class);
stream_filter_append($file, 'file.decode');

echo fread($file, filesize('cursos.csv'));
3 respostas
solução!

Opa, Interessante, Nicolas. Por que separar as linhas e não fazer utf8_decode direto em $bucket->data?

Haha, sinceramente não pensei em separar as linhas, eu apenas segui o modelo do filtro feito em uma outra aula, retirando a lógica daquele (o alura.partes) e adicionando o utf8_decode.

Refiz, fazendo direto no $bucket->data:

DecodeFiltro.php:

public function filter($in, $out, &$consumed, $closing)
    {
        $saida = '';

        while($bucket = stream_bucket_make_writeable($in)){
            $saida = utf8_decode($bucket->data);
        }

        $bucketSaida = stream_bucket_new($this->stream, $saida);
        stream_bucket_append($out, $bucketSaida);

        return PSFS_PASS_ON;
    }

Boa! Bem mais simples! :-D

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software