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

[Dúvida] Stream filter sem utf8_decode

Boa tarde a todos!

Estou com um problema com os charsets na implementação do Filtro de Stream personalizado utilizando o php 8.2. Como o utf8_encode e decode foram descontinuados no php 8.2, tentei fazer o filtro pelo mb_convert_encoding, mas sem sucesso. E quando mudei pro utf8, também obtive o mesmo problema. Tentei abrir o arquivo .csv tanto no Excel quanto no LibreOffice, e os conjuntos de caracteres especiais aparecem zuados nos dois programas. Alguém passou pelo mesmo problema?

Arquivo csv.php

<?php
require 'MeuFiltro.php';

$arquivo = file('stacks.txt');
$arquivoCsv = fopen('stacks.csv', 'w+');

stream_filter_register('exemplo.utf8', MeuFiltro::class);
stream_filter_append($arquivoCsv, 'exemplo.utf8');

foreach($arquivo as $linha){
    $stack = [trim($linha), 'teste'];

    fputcsv($arquivoCsv, $stack, ';');
}

fclose($arquivoCsv);

Arquivo MeuFiltro.php

<?php

class MeuFiltro extends php_user_filter{
    public $stream;

    //Ao criar o filtro, cria também o stream como um recurso PHP, para uso no método filter
    public function onCreate() : bool{
        $this->stream = fopen('php://temp', 'w+');
        return $this->stream !== false;
    }

    /*
        $in = recurso de entrada - esses recursos contém buckets, que são pedaços do arquivo
        $out = recurso de saida
        &$consumed = número de bytes consumidos
        $closing = se o stream tá sendo fechado ou não
    */
    public function filter($in, $out, &$consumed, $closing) : int{
        $saida = '';

        while($bucket = stream_bucket_make_writeable($in)){ //verifica se a entrada ainda é válida (ainda pode ser manipulável)
            $saida = mb_convert_encoding($bucket->data, 'Windows-1252', 'UTF-8');
        }

        $bucketSaida = stream_bucket_new($this->stream, $saida); //manipula o recurso criado pelo filtro, com os dados de saida processados
        stream_bucket_append($out, $bucketSaida); //vincula o recurso criado, com os dados processados, ao recurso de saída

        return PSFS_PASS_ON;
    }
}

Saída pelo VSCode

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Saída pelo Excel

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

2 respostas

Olá, Paulo. Tudo bem?

Desculpa pela demora em responder o seu tópico.

Eu fiz o teste aqui utilizando o conteúdo do txt do curso e o seu código e funcionou:

Planilha do excel com a primeira coluna com informações de cursos de PHP, e a segunda coluna com o nome "teste" repetidas vezes

Como você abriu este tópico há 2 meses, você conseguiu resolver?

Fico no aguardo :)

solução!

Bom dia Vinícius, tudo bem?

Então, na verdade eu também havia me esquecido desse problema e segui o restante da formação. Mas testando agora, só consegui resolver retirando o $to_encoding do mb_convert_encoding, ficando assim:

$saida = mb_convert_encoding($bucket->data, '', 'UTF-8');

Com a adição do $to_encoding, ele retornava os caracteres com problema, mesmo com o txt do curso. Acredito que seja alguma configuração da minha máquina mesmo.

Valeu!