El BOM (Byte Order Mark) es un uso del caracter Unicode especial (U+FEFF) como número mágico al comienzo de un stream de texto, que puede indicar diferentes señales a un programa que lea el texto: el ordenamiento de bytes (o endianness en codificaciones de 16 y 32 bits); el hecho de que el conjunto de caracteres esté codificado en UTF-8 (a un nivel mayor de confianza); o qué codificación de caracteres Unicode se utiliza.

El uso del BOM es opcional y su presencia suele interferir con el uso de UTF-8 en programas que no esperan caracteres no-ASCII al comienzo de un stream de texto. Especialmente compiladores e intérpretes de archivos de código fuente de diversos lenguajes de programación. Por ende no es recomendable utilizar BOM al guardar archivos desde editores cuando se trata de archivos fuente.

Este artículo explica cómo remover el BOM de un archivo UTF-8 desde línea de comandos en Linux utilizando sed.



En mi caso tuve problemas con el BOM al tratar de compilar un fuente de Verilog con Icarus Verilog en Linux:

emi@vaio:~/Downloads$ iverilog -o CLAA CLAA.v 
No top level modules, and no -s option.

Al revisar el código fuente, no existen errores de ningún tipo. Con lo cual, se me ocurrió que podría llegar a tratarse del bendito BOM. Más precisamente porque al abrir el archivo con el editor nano veía el mensaje "Converted from DOS format". Es común que los editores de texto para Windows y algunos IDEs agreguen el BOM a los archivos UTF-8.

En los sistemas operativos de la familia Unix, basta con utilizar el comando file para determinar el tipo exacto y formato de cualquier archivo desde línea de comandos:

emi@vaio:~/Downloads$ file CLAA.v
CLAA.v: UTF-8 Unicode (with BOM) text, with CRLF line terminators

Efectivamente el archivo contenía el BOM, y éste seguramente estaba interfiriendo con el compilador iverilog. Ocurre que muchos compiladores tienen problemas con el BOM en archivos de código fuente. La solución entonces consiste en eliminar el BOM.

Como mencionaba la comienzo, el BOM es el caracter especial U+FEFF en la primera posición del stream de texto. La herramienta sed permite utilizar secuencias de escape Unicode empleando la forma de entrecomillado que comienza con el caracter $. De esta forma, es posible remover el BOM de un archivo de forma segura (es decir, sólo en la primera posición) con el siguiente comando:

sed -i $'1s/^\uFEFF//' archivo.txt

Este comando deja el archivo intacto si no contiene BOM, o lo elimina si está presente en la primera posición. Lo cual permite emplearlo desde scripts y de manera recursiva, si así se quisiera.

emi@vaio:~/Downloads$ sed -i $'1s/^\uFEFF//' CLAA.v
emi@vaio:~/Downloads$ file CLAA.v
CLAA.v: ASCII text, with CRLF line terminators

Se observa que luego de ejecutar el comando el archivo ya no contiene BOM.


Tal vez pueda interesarte


Compartí este artículo