SAFTCheck

encoding.bom

Byte Order Mark (BOM) al inicio del fichero

La AT rechaza los ficheros SAF-T que empiezan por un BOM UTF-8 o UTF-16.

Qué es un BOM

Un Byte Order Mark es una firma de 2 o 3 bytes al principio absoluto de un fichero de texto que indica qué codificación Unicode usa el fichero. No se ve en la mayoría de los editores, y por eso cuesta tanto encontrarlo:

CodificaciónBytes del BOMQué significa para un fichero SAF-T
UTF-8EF BB BFElimina los 3 bytes; revisa también la declaración de codificación.
UTF-16 BEFE FFTodo el fichero está en UTF-16: hay que convertirlo, no basta con recortarlo.
UTF-16 LEFF FEIgual que el anterior. Típico de ficheros guardados como "Unicode" por herramientas de Windows.

Por qué la AT rechaza BOMs

La AT espera los ficheros SAF-T (PT) en Windows-1252, que no tiene BOM. El esquema y el parser de entrada de la AT esperan que el primer byte del fichero sea el < de la declaración XML, no una firma Unicode.

Cuando hay un BOM, el XML puede abrirse sin problemas en un navegador o en tu ERP, pero el fichero se rechaza en la entrada sin un error útil. Consulta qué significan los mensajes de error de la AT para ver los mensajes que te pueden aparecer.

Cómo debe empezar el fichero

Un fichero SAF-T (PT) correcto empieza directamente con la declaración XML:

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

En un editor hexadecimal, los primeros bytes son 3C 3F 78 6D 6C (<?xml). Con un BOM UTF-8 son EF BB BF 3C 3F.

Cómo aparece un BOM

  • Abrir la exportación en el Bloc de notas y volver a guardarla como "UTF-8 con BOM" (lo predeterminado en versiones antiguas de Windows) o como "Unicode" (UTF-16).
  • Algunos ERPs y herramientas de informes anteponen un BOM al exportar XML compatible con Unicode.
  • Convertir el fichero con una herramienta que añade una firma, o unir ficheros con un script que la escribe.

Cómo comprobar tu fichero

Mira los tres primeros bytes:

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

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

Si ves EF BB BF, FF FE o FE FF, el fichero tiene un BOM. También puedes subir el fichero a SAFTCheck, que lo comprueba en cada subida.

Cómo corregir

BOM UTF-8: elimina los 3 primeros bytes; el resto del fichero se queda igual.

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

BOM UTF-16: eliminar los bytes no basta, porque cada carácter del fichero ocupa 2 bytes. Convierte todo el fichero a Windows-1252 y luego asegúrate de que la declaración dice encoding="Windows-1252":

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

En Windows sin herramientas de línea de comandos: en Notepad++, usa Codificación y luego "Convertir a ANSI", y guarda. Evita volver a guardar con el Bloc de notas de Windows, que a menudo es justo lo que metió el BOM.

La mejor solución a largo plazo está en la configuración de exportación del ERP, para que el fichero del mes siguiente salga bien.

Qué hace SAFTCheck

El hallazgo aparece como encoding.bom con la ubicación "File offset 0" y el tipo de BOM (UTF-8, UTF-16 BE o UTF-16 LE). "Corregir automáticamente y descargar" elimina un BOM UTF-8 y convierte los ficheros UTF-16 a Windows-1252, junto con cualquier otra corrección de codificación que necesite el fichero. El fichero corregido se valida de nuevo antes de que lo descargues.

Una línea en blanco o espacios antes de <?xml provocan el mismo tipo de rechazo silencioso; la corrección automática también los elimina.

Relacionado

Otras reglas