1
resposta

Problema de Encoding na hora de criar o HTML

Acabei postando a pergunta no fórum do segundo curso, sendo que a dúvida é do primeiro... Os caracteres especiais que uso no título do html não são salvos corretamente no arquivo de saída, por mais que eu defina o encoding no comando out-file. O que devo fazer?

param ($tipoExportacao)

# Parando a execução do script em qualquer erro
$ErrorActionPreference = "Stop"

# Preparando as colunas com os nomes e tamanhos
$nameExpr = @{
    Label = "Nome";
    Expression = { $_.Name }
}
$lengthExpr = @{
    Label = "Tamanho";
    Expression = {'{0:N2}KB' -f ($_.Length/1kb)}
}

# Eu quis usar a definição explícita de lista
$params = @( $nameExpr, $lengthExpr )

# Salvando na variável. Pode ter um espaço depois do = que o PS ainda entende que não é o fim do comando.
$resultado = 
gci -Path 'C:\pessoal\' -Recurse -File |
Where-Object Name -Like '*.md' |
select $params

if ($tipoExportacao -eq "html") {
    $estilo = Get-Content -Path 'C:\temp\styles.css'
    $estilo = '<style>' + $estilo + '</style>'
    $titulo = 'Grande Título do Relatório'

    # Aqui é uma forma mais amigável de fazer uma série de concatenações. A forma padrão seria:
    # $titulo_body = "<h1>" + $titulo + "</h1>"
    # Mas essa forma inteligente só funciona com as aspas duplas. Com a simples é um texto mesmo.
    $titulo_body = "<h1> + $titulo + </h1>"
    # Gerando um html
    $resultado | ConvertTo-Html -Head $estilo -Title $titulo -Body $titulo_body | Out-file -encoding 'utf8' -filepath 'c:\temp\relatorio.html'
} elseif ($tipoExportacao -eq "csv") {
    $resultado |
        ConvertTo-Csv -Delimiter ';' -NoTypeInformation |
        Out-file -encoding 'utf8' -filepath 'c:\temp\relatorio.csv'
} elseif ($tipoExportacao -eq "json") {
    $resultado |
        ConvertTo-Json |
        Out-file -encoding 'utf8' -filepath 'c:\temp\relatorio.json'
}
1 resposta

Olá Igor, tudo bem com você?

Peço desculpas pela demora em obter um retorno.

O comportamento apresentado está relacionado com a uso do unicode UFT-8 no comando Out-file para a gerar um arquivo HTML com os dados obtidos pelo comando ConvertTo-Html, está ocorrendo uma incompatibilidade com o Byte Order Mark (BOM), que é um marcador colocado no início do arquivo de texto para indicar o tipo de codificação usado. Neste caso ele está sendo interpretado incorretamente ou até mesmo sendo considerado como parte do texto, gerando o erro na exibição do título.

Para contornar este erro, basta utilizar a unicode padrão do comando Out-file, neste caso -encoding 'default'. O padrão 'default' que faz o uso do encoder utf8NoBOM, esse encoder desconsidera o Byte Order Mark no momento de codificar o arquivo para UTF-8. O código ficará da seguinte forma:

$resultado | ConvertTo-Html -Head $estilo -Title $titulo -Body $titulo_body | Out-file -encoding 'default' -filepath 'c:\temp\relatorio.html'

Após realizar essa mudança, salve o arquivo com o script e execute-o novamente. Abra no navegador o arquivo gerado e verifique o resultado apresentado.

Espero ter ajudado. Continue mergulhando em conhecimento e não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Em caso de dúvidas estou à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!