SAFTCheck

encoding.bom

Byte Order Mark (BOM) no início do ficheiro

A AT rejeita ficheiros SAF-T que começam com um BOM UTF-8 ou UTF-16.

O que é um BOM

Um Byte Order Mark é uma assinatura de 2 ou 3 bytes no início absoluto de um ficheiro de texto, que sinaliza qual a codificação Unicode usada pelo ficheiro. Na maioria dos editores não é visível, e é isso que o torna difícil de encontrar:

CodificaçãoBytes do BOMO que significa para um ficheiro SAF-T
UTF-8EF BB BFRetire os 3 bytes; verifique também a declaração de codificação.
UTF-16 BEFE FFTodo o ficheiro está em UTF-16: tem de ser convertido, não basta cortar os bytes.
UTF-16 LEFF FEO mesmo que acima. Típico de ficheiros gravados por ferramentas Windows como "Unicode".

Porque é que a AT rejeita BOMs

A AT espera ficheiros SAF-T (PT) em Windows-1252, que não tem BOM. O esquema e o parser de entrada da AT esperam que o primeiro byte do ficheiro seja o < da declaração XML, não uma assinatura Unicode.

Quando há um BOM, o XML pode abrir sem problemas num navegador ou no seu ERP, mas o ficheiro é rejeitado à entrada sem uma mensagem de erro útil. Consulte o que significam as mensagens de erro da AT para ver as mensagens que pode encontrar.

Como deve ser o início do ficheiro

Um ficheiro SAF-T (PT) correto começa diretamente com a declaração XML:

<?xml version="1.0" encoding="Windows-1252"?>
<AuditFile xmlns="urn:OECD:StandardAuditFile-Tax:PT_1.04_01">

Num editor hexadecimal, os primeiros bytes são 3C 3F 78 6D 6C (<?xml). Com um BOM UTF-8 são EF BB BF 3C 3F.

Como aparece um BOM

  • Abrir a exportação no Bloco de Notas e gravá-la novamente como "UTF-8 com BOM" (o padrão em versões mais antigas do Windows) ou como "Unicode" (UTF-16).
  • Alguns ERPs e ferramentas de relatórios acrescentam um BOM ao exportar XML compatível com Unicode.
  • Converter o ficheiro com uma ferramenta que adiciona uma assinatura, ou juntar ficheiros com um script que a escreve.

Como verificar o seu ficheiro

Observe os três primeiros bytes:

# Linux / macOS
head -c 3 my.xml | xxd

# Windows PowerShell
Format-Hex my.xml | Select-Object -First 1

Se vir EF BB BF, FF FE ou FE FF, o ficheiro tem um BOM. Em alternativa, carregue o ficheiro no SAFTCheck, que faz esta verificação em cada carregamento.

Como corrigir

BOM UTF-8: retire os primeiros 3 bytes; o resto do ficheiro mantém-se igual.

# Linux / macOS
sed -i '1s/^\xEF\xBB\xBF//' my.xml

BOM UTF-16: retirar os bytes não chega, porque cada carácter do ficheiro ocupa 2 bytes. Converta todo o ficheiro para Windows-1252 e confirme depois que a declaração indica encoding="Windows-1252":

# Linux / macOS
iconv -f UTF-16 -t WINDOWS-1252 my.xml > my-fixed.xml

Em Windows sem ferramentas de linha de comandos: no Notepad++, use Codificação, depois "Converter para ANSI", e grave. Evite voltar a gravar com o Bloco de Notas do Windows, que é muitas vezes a origem do BOM.

A melhor correção a longo prazo está nas definições de exportação do ERP, para que o ficheiro do mês seguinte saia correto.

O que o SAFTCheck faz

O resultado aparece como encoding.bom com a localização "File offset 0" e o tipo de BOM (UTF-8, UTF-16 BE ou UTF-16 LE). "Corrigir automaticamente e descarregar" retira um BOM UTF-8 e converte ficheiros UTF-16 para Windows-1252, juntamente com quaisquer outras correções de codificação de que o ficheiro precise. O ficheiro corrigido é validado novamente antes de o descarregar.

Uma linha em branco ou espaços antes de <?xml provocam o mesmo tipo de rejeição silenciosa; a correção automática também os remove.

Relacionado

Outras regras