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ón | Bytes del BOM | Qué significa para un fichero SAF-T |
|---|---|---|
| UTF-8 | EF BB BF | Elimina los 3 bytes; revisa también la declaración de codificación. |
| UTF-16 BE | FE FF | Todo el fichero está en UTF-16: hay que convertirlo, no basta con recortarlo. |
| UTF-16 LE | FF FE | Igual 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
- Declaración de codificación XML (Windows-1252): el requisito más amplio de codificación.
- Cómo corregir el error de codificación UTF-8 del SAF-T en Portugal