martes, 29 de abril de 2014

Receta No. 2-2 en C#: Codificar una Cadena de Caracteres usando Sistema de Codificación Alternativo

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código Fuente C#
5. Conclusiones
6. Glosario
7. Enlaces & Literatura

0. Introducción

Pasemos a otra receta. En esta receta vamos a aprender acerca de la transformación (o conversión) entre sistemas de codificación de caracteres. Veremos que el sistema que utiliza la Common Language Runtime (CLR) para representar y manipular cadenas caracteres es UTF-16. ¿Cuál será la utilidad directa de esta receta? Sencillamente cuando nos enfrentemos al intercambio de datos entre sistemas heterogéneos, será necesario contar con un mecanismo de conversión de datos entre dos o más sistemas de información. Empecemos ahora mismo.

1. Problema

Como mencionamos en la introducción una necesidad explícita de los sistemas informáticos es el intercambio de información. Del departamento de TI nos informan que debido a cambios estratégicos en el modelo de partners, se requiere hacer una integración entre dos sistemas: el SistemaA (que es propio de nuestra organización), y la del nuevo partner extranejero, el SistemaB. Estos sistemas van a intercambiar información constantemente, pero debido a casos de compatibilidad relacionados con la regionalización de los sistemas informáticos, esto no es posible.

2. Solución

El arquitecto de software ha encontrado los recursos clave en nuestra plataforma de desarrollo (Microsoft .NET Framework) para llevar a cabo la tarea de conversión de cadenas de caracteres (datos de intercambio) entre los diferentes sistemas de codificación (códigos de página) de los sistemas de las dos organizaciones. A continuación, en la siguiente sección vamos a ver esto con más detalle.

3. Discusión de la Solución

Se mencionó en la introducción que la Common Language Runtime (CLR) manipula y representa cadenas de caracteres utilizando el código de página [2, 3] (o esquema de codificación de caracteres, o, ~character-encoding scheme) a través del esquema UTF-16 [6]. Debido a que este es el sistema por defecto que utiliza la CLR, la situación que requiera intercambiar datos con otros sistema de información que utilicen diferentes tipos de esquemas (e.g., ASCII (20127), UTF-7 (65000), UTF-8 (65001), BigEndianUnicode (1201), Unicode (12000), para sistemas operativos Windows (1252)) tenemos que recurrir a artefactos del Framework para realizar las conversiones requeridas.

En la Figura 1 se muestra el listado de clases del Framework para la codificación de caracteres.
Clases de codificación de caracteres en .NET Framework.
Figura 1. Clases de codificación de caracteres en .NET Framework [1].
Continuando, .NET Framework posee la clase abstracta Encoding [7]  que permite obtener una instancia de uno de los sistemas de codificación enumerados en la Figura 1 a través del método GetCoding [4]. Este método tiene varias versiones sobrecargadas. Solo voy a mencionar dos:

public static Encoding GetEncoding(int codepage)

-y-

public static Encoding GetEncoding(string name)

La primera versión sobrecargada permite pasar un número entero (int) que representa el identificador código de página (e.g., 20127 (ASCII), 65001 (Windows OS), y 0 (predeterminado)).

En tanto, la segunda versión permite pasar una cadena de caracteres (string) que representa el código de página (e.g., "utf-32""utf-7").

En la Figura 1 también se enlistan una serie de propiedades estáticas de la clase Encoding que representan los códigos de página:
  • Encoding.UTF7 [8]
  • Encoding.UTF8 [9]
  • Encoding.UTF32 [10]
[Nota: Para conocer el listado completo de estas propiedades ir a [11].]

El siguiente a paso a realizar (después de haber creado el objeto que representa el esquema actual de códificación de nuestro sistema), es hora de pasar a convertir el flujo de caracteres en un flujo de bytes a través del método GetBytes [12] (FQCN: System.Text.Encoding.GetBytes).

El método opuesto a la operación es GetString [13] que permite obtener la cadenas de caracteres del flujo de caracteres a partir de un flujo o secuencia de bytes.

4. Práctica: Código Fuente C#

Veamos en el siguiente ejemplo cómo convertir una cadena de caracteres codificada en UTF-16 (esquema de la CLR) en esquemas (códigos de página) de diferente (i.e., UTF-8, ASCII).


Compilación:

  1. csc /target:exe /out:ConversionEsquemasCaracteres.exe ./ConversionEsquemasCaracteres.cs

Ejecución:

  1. ./ConversionEsquemasCaracteres.exe

El archivo de texto de salida (salida.txt):

5. Notas Finales

Vale apuntar que la clase Encoding posee el método Convert (static). Este método  tiene una versión sobrecargada con la siguiente firma:

public static byte[] Convert(Encoding srcEncoding, Encoding dstEncoding, byte[] bytes)

Lo que nos va a facilitar y agilizar el proceso de conversión entre dos sistemas de codificación de caracteres.

byte[] bytesAscii = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, bytesUnicode);

5. Conclusiones

La preparación de esta receta nos ha enseñado a manipular cadenas de caracteres con diferentes esquemas de caracteres (códigos de página - code page) a través de los artefactos que nos brinda el Framework .NET. Esto nos da la oportunidad de intercambiar datos entre distintos sistemas de información de forma muy fácil y práctica. En el ejemplo presentado en la sección 4 vimos la conversión de un texto en UTF-16 (predetermiando de la CLR) a otros (UTF8 y ASCII), y de éstos últimos al esquema de caracteres por defecto (UTF-16). Los resultados se muestra en el archivo de salida (salida.txt).

6. Glosario

  • CLR
  • Code page
  • Código de página
  • Common Language Runtime
  • FQCN: Fully Qualified Class Name
  • Intercambio de información
  • Regionalización

7. Enlaces & Literatura

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: Code page, the free encyclopedia - http://en.wikipedia.org/wiki/Code_page
[3]: Página de códigos, la enciclopedia libre - http://es.wikipedia.org/wiki/P%C3%A1gina_de_c%C3%B3digos
[4]: Encoding.GetEncoding Method (Int32) (System.Text) - http://msdn.microsoft.com/en-us/library/wzsz3bk3%28v=vs.110%29.aspx
[5]: Text Encoding Tables Index - http://www.string-functions.com/encodingindex.aspx
[6]: UTF-16, the free encyclopedia - http://en.wikipedia.org/wiki/UTF-16
[7]: Encoding Class (System.Text) - http://msdn.microsoft.com/en-us/library/system.text.encoding%28v=vs.110%29.aspx
[8]: Encoding.UTF7 Property (System.Text) - http://msdn.microsoft.com/en-us/library/system.text.encoding.utf7(v=vs.110).aspx
[9]: Encoding.UTF8 Property (System.Text) - http://msdn.microsoft.com/en-us/library/system.text.encoding.utf8(v=vs.110).aspx
[10]: Encoding.UTF32 Property (System.Text) - http://msdn.microsoft.com/en-us/library/system.text.encoding.utf32(v=vs.110).aspx
[11]: Encoding Properties (System.Text) - http://msdn.microsoft.com/en-us/library/system.text.encoding_properties(v=vs.110).aspx
[12]: Encoding.GetBytes Method (String) (System.Text) - http://msdn.microsoft.com/en-us/library/ds4kkd55(v=vs.110).aspx
[13]: Encoding.GetString Method (System.Text) - http://msdn.microsoft.com/en-us/library/system.text.encoding.getstring(v=vs.110).aspx


M

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.