miércoles, 5 de marzo de 2014

¿Qué es BOM?

BOM Byte order mark se usa en ámbito de codificación de archivos y representa una combinación de bytes que proporciona información sobre como están ordenados el resto de bytes en una secuencia de datos unicode.

En escenarios de intercambio de archivos es recomendable controlar este aspecto y sólo incluir la marca BOM si realmente es lo pactado entre las partes.

El intercambio de archivos contra otra aplicación es un escenario muy habitual, sin ir más lejos ahora consultando este blog tu navegador se está 'entendiendo' con el servidor de donde descarga el contenido para que los archivos sean legibles y poder mostrarte el este artículo... Es difícil encontrar contenido no legible desde un navegador actual en internet ya que cada vez más, los fabricantes de sistemas operativos usan formatos que permiten un margen más amplio de caracteres que ASCII o UTF-8 con lo que apuestan por una codificación global.

Es más fácil encontrarse el problema en un escenario donde tienes que programar una llamada a un servicio web o similar enviando contenido XML y el servidor se queja del BOM al intentar leer el mensaje. Esto se debe a que dependiendo de la codificación, BOM puede ser obligatorio, opcional o no producir ningún efecto. En función del sistema operativo puede ser que trate una situación u otra de modo diferente, por ejemplo en UTF-8 incluir BOM es opcional pero posiblemente algún des-serializador de problemas al leer el contenido si se incluye. Hay codificaciones que si no se ha incluido la información de marcado podrían generar algún carácter no deseado como un espacio en blanco al recibir el fichero.

Por tanto es interesante saber como especificarle al serializador la codificación del contenido y si queremos incluir BOM o no. Veamos un ejemplo sobre como alterar esto en .NET usando XmlSerializer.
  XmlWriterSettings settings = new XmlWriterSettings();
  settings.Encoding = new UTF8Encoding(false);

  using (XmlWriter oWriter = XmlWriter.Create(path,settings))
  {
     XmlSerializer oSerializer;
     oSerializer = new XmlSerializer(typeof(Document));
     oSerializer.Serialize(oWriter,mDocuementSepa);
  }
Mediante XmlWriterSettings podemos acceder al atributo Encoding donde especificamos la codificación. Fijaros en el constructor de UTF8Encoding especificamos el parámetro encoderShouldEmitUTF8Identifier a false para evitar que se incluya BOM.

Si queréis una explicación más técnica sobre que es BOM y como influye exactamente os paso esta página donde está bastante bien explicado y traducido. Hasta aquí el artículo de hoy, recordar que podéis seguir areaTIC en las redes sociales. Si quieres participar en areaTIC puedes ponerte en contacto con nosotros a través del form de contacto. Hasta la próxima!

No hay comentarios:

Publicar un comentario