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
Saída pelo Excel