Codificaciones de Texto

Todos los ordenadores utilizan sistemas de codificación para almacenar las cadenas de caracteres como una serie de bytes. El esquema de codificación más familiar y antiguo es la codificación ASCII. Este define los códigos de caracteres sólo para los valores comprendidos entre 0 y 127. Estos vaores incluyen sólo los caracteres en mayúsculas y minúsculas correspondientes al alfabeto en inglés, así como los números, algunos símbolos y códigos de control invisibles utilizados en los primeros ordenadores. Puedes utilizar la función Chr para obtener el caracter que se corresponde con un código ASCII en particular. A continuación encontrarás traducido al castellano el contenido sobre codificaciones, aplicadas a Xojo, correspondiente al original que puedes encontrar en el área de desarrolladores del sitio web en este enlace.

Son varias las ampliaciones de ASCII que permiten manejar símbolos adicionales, así como caracteres con acentos, alfabetos no latinos, etc. En particular, la codificación Unicode está diseñada para manejar cualquier lenguaje y mezcla de lenguajes en una misma cadena. Tu aplicación puede soportar dos formatos Unicode diferentes: UTF-8 y UTF-16. Todas tus constantes, literales de cadena, etc, se almacenan internamente utilizando la codificación UTF-8.

Si las cadenas con las que trabajas se crean, guardan y leen desde tu aplicación, entonces no deberías de preocuparte sobre los problemas de codificación dado que la codificación utilizada se almacena junto con el contenido de la cadena.

  • Nota: las cadenas de las Estructuras no contienen información de codificación.

Si estás creando aplicaciones que abren, crean o modifican archivos de texto creados fuera de la aplicación, entonces necesitas comprender como funcionan las codificaciones de texto y qué cambios has de realizar en tu código para asegurarte de que continúe funcionando correctamente.

De ASCII a Unicode

Como sabes, los ordenadores no almacenan o comprenden realmente los caracteres. Estos almacenan cada caracter como un código numérico. Por ejemplo, el Retorno es el número 13 de los caracteres ASCII. Cuando la industria informática estaba en su infancia cada fabricante de ordenadores utilizaba su propio esquema de numeración. Algunas veces se denominan dichos esquemas como conjunto de caracteres. Se trata de una asociación o mapeado de letras, números, símbolos y códigos invisibles a códigos invisibles (como el regorno de carro o el avance de línea). Con un conjunto de caracteres la información puede intercambiarse entre ordenadores fabricados por diferentes empresas.

En 1963 la American Standards Association (posteriormente denominada American National Standards Institute) anunciaron el American Standard Code for Information Interchange (ASCII) basado en el conjunto de caracteres disponible en una máquina de escribir en inglés.

A lo largo de los años, los ordenadores fueron más y más populares fuera de los Estados Unidos y el ASCII comenzó a mostrar sus debilidades. El conjunto de caracteres ASCII sólo define 128 caracteres. Esto cubre lo que está disponible en una máquina de escribir en inglés, además de algunos caracteres especiales de “control” que se podían utilizar en los ordenadores para controlar la salida. No incluye caracteres especiales utilizados habitualmente en los libros tipográficos como las comillas curvadas o el apóstrofe, los topos y las líneas largas. De igual modo, muchos idiomas (como el Español o el Alemán) utilizan caracteres tildados que no están definidos como parte de la especificación ASCII.

Cuando se presentaron los sistemas operativos Macintosh y Windows, cada sistema operativo creó extensiones al estánar ASCII mediante la definición de códigos desde el 128 hasta el 255. Esto permitió que ambos sistemas operativos pudiesen gestionar los caracteres con acentos y otros símbolos no soportados originalmente por el estándar ASCII. Sin embargo, las extensiones de Macintosh y de Windows no se correspondían entre sí. Las aplicaciones multiplataforma tenían que crear algún modo de gestionar el texto que utilizase los caracteres en el rango de 128 a 255.

El problema es incluso peor para los usuarios de lenguajes que no utilizan los caracteres del alfabeto latino en absoluto, como puedan ser el Japonés, el Chino o el Hebreo. Dado que hay tantos caracteres, los conjuntos de caracteres dirigidos a soportar algunos de estos lenguajes utilizan dos bytes de datos por caracter (en vez de sólo un byte por caracter, tal y como hace ASCII).

Apple creó varias codificaciones de texto para facilitar la gestión de datos. MacRoman es una codificación de textos para los archivos que utilizan ASCII. MacJapanese es una codificación de texto para los archivos que almacenan caracteres en Japonés. También hay otros. Pero estas codificaciones son específicas para Mac y no facilitan el intercambio de datos con otros sistemas operativos. Además también resultaba problemático mezclar datos con diferentes codificaciones, como por ejemplo escribir una frase en Japonés en la mitad de un documento escrito en Español.

En 1996 las personas de Xerox y Apple tenían que resolver diferentes tipos de problemas en los que se requería la misma solución. Pronto se hizo evidente como solución el concepto de una codificación de texto universal que contuviese todos los caracteres para todos los idiomas. La codificación universal se denominó Unicode por uno de los trabajadores de Xerox que contribuyó a su creación. Unicode soluciona todos estos problemas Cualquier caracter que necesites de cualquier idioma está soportado y será el mismo caracter en cualquier ordenador que soporte Unicode. Como característica adicional puedes mezclar los caracteres de diferentes idiomas en un documento, dado que todos ellos están definidos en Unicode.

El soporte para Unicode comenzó a aparecer sobre el Macintosh con el Sistema 7.6 y en Windows con Windows 95. Podías convertir los archivos entre otras codificaciones de texto y Unicode, pero Unicode seguía siendo la excepción y no la regla. No fue hasta Mac OS X y Windows 2000 cuando Unicode se convirtió en el estándar.

Algunas personas aún continúan utilizando sistemas antiguos en los cuales Unicode no es el estándar. Todos los nuevos sistemas que funcionan bajo macOS, Windows o Linux utilizan Unicode como codificación estándar de texto. Por tanto, es probable que aun debas de preocuparte sobre las codificaciones de texto a la hora de trabajar con archivos de texto. Esto significa que es probable que debas de modificar tu código para gestionar este aspecto. En algún momento futuro será extremadamente inusual que un archivo de texto utilice una codificación distinta de Unicode, pero hasta entonces tendrás que modificar tu código para que tu aplicación funcione correctamente cuando se encuentre con archivos de texto con diferentes codificaciones de texto.

Gestionar las Codificaciones de Texto

Desafortunadamente no existe un modo perfectamente seguro de determinar la codificación de un archivo. Has de saber qué codificación está usando el archivo. Por ejemplo, si proviene de un usuario de habla inglesa en Windows, es probable que utilice Windows ANSI.

Si no está definida la codificación de una cadena, entonces puedes utilizar la función Encoding para obtener su codificación tal y como se muestra a continuación:

theEncoding = Encoding(myString)

Donde la variable myString contiene la cadena cuya codificación ha de determinarse y theEncoding es un objeto TextEncoding. Si no está definida la codificación, entonces la función Encoding devolverá el valor `Nil`.

Codificación de Texto y Archivos

Cuando se manejan datos de texto en archivos, resulta particularmente importante gestionar correctamente las codificaciones. Puedes encontrar información adicional en la sección de Archivos de Texto en el sitio web de Xojo.

Obtener caracteres individuales

Tal y como se ha mencionado anteriormente, cuando has de obtener un caracter ASCII individual puedes utilizar la función `Chr` pasando el código ASCII para el caracter deseado. Pero si quieres un caracter no ASCII, entonces también has de indicar la codificación. La función Chr es exclusivamente para la codificación ASCII, y es probable que no obtengas el caracter deseado si el número pasado es superior a 127. En vez de ello deberás de utilizar el método `Chr` de la clase TextEncoding. Este requiere que indiques tanto la codificación como el valor del caracter. Por ejemplo, lo siguiente devuelve el símbolo en la variable s:

Dim s As String s = Encodings.MacRoman.Chr(170)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *