‒ Codificación de caracteres.
Antes de explicar los tipos de datos para caracteres que ofrece el compilador Free Pascal, primero explicaré un poco sobre la codificación de caracteres. La codificación de caracteres son normas para relacionar un código con un determinado carácter, que pueden ser letras, símbolos, cifras o ideogramas de un sistema de escritura y caracteres de control (ejemplo, el carácter de control que indica a la impresora un salto de página). El código que se usa para relacionar un determinado carácter, puede ser una serie de impulsos eléctricos, un número u otro sistema de representación.
El ejemplo más antiguo de codificación de caracteres es el código Morse, que hace corresponder los caracteres con un código representado por puntos y rallas. Pero uno de los primeros sistemas de codificación de caracteres que usaron códigos digitales fue el BCDIC (Binary Coded Decimal Interchange Code ó Código de Intercambio decimal codificado en binario), en donde sus códigos usaban 6 dígitos binarios, es decir se podían representar un máximo de 64 caracteres (26=64). Conforme paso el tiempo se creó el código ASCII (American Standard Code for Information Interchange), que permitía usar códigos digitales con 7 dígitos binarios, es decir permitía representar un máximo de 128 caracteres (27=128).
Debido a que los códigos ASCII usan sólo 7 dígitos binarios, muchos fabricantes de computadoras, programas y países, extendieron la codificación a 8, 16 o más dígitos binarios; permitiendo cubrir símbolos específicos para otros idiomas como el japonés, hindú, el idioma chino, etc. Esta extensión creo muchas variantes de codificación de caracteres, ocasionando que algunas variantes representen por ejemplo la letra ñ con el número 164, y otros con el número 241, otros problemas que surgieron, fue que algunas codificaciones usaban una longitud variable de 8, 16 o más dígitos binarios para representar los caracteres, y algunas de ellos no tenían los 128 caracteres originales completos de los códigos ASCII. A continuación una tabla resumen con algunas de las codificaciones de caracteres más conocidas:
Codificación | Descripción |
ASCII. |
Creado por el ANSI, basado en caracteres latinos que se usan en el idioma inglés moderno. 7 bits. |
Big5 |
Código de caracteres usado en Taiwan, Hong kong y Macao, para ideogramas tradicionales. Variantes: Big5-HKSCS. |
EUC |
Extended Unix Code, es una codificación de caracteres de longitud variable (multibyte), usada principalmente por japoneses, koreanos y el chino simplificado. Su codificación está basado en el ISO -2022. Variantes: EUC-JP, EUC-CN, EUC-KN, EUC-TW. |
GB2312 |
Codificación de caracteres de la Republica popular de china. GB son abreviaturas de Guojia Biaozhun (国家标准), que significa Estándar Nacional. Se creó en 1980. |
GB18030
|
Codificación de caracteres de la Republica popular de china. GB son abreviaturas de Guojia Biaozhun (国家标准), que significa Estándar Nacional. Se creó en 2000, actualizado en 2005. |
IBM code pages.
|
IBM, creó muchas codificaciones para distintos lugares o países, que los agrupa en varias páginas de codificación (code pages). Algunas variantes de estas codificaciones son: IBM-Thai, IBM 00858, IBM 037, IBM 01140 hasta IBM 01149, IBM 273, IBM 277, IBM 278, IBM 280, IBM 284, IBM 285, IBM 297, IBM 437, IBM 500, IBM 775, IBM 850, IBM 852, IBM 855, IBM 857, IBM 860 hasta IBM 866, IBM 868 hasta IBM 871, IBM 918, IBM 1026, IBM 1047, etc. |
ISO
|
El Organismo de estándares internacionales creo algunas de las siguientes codificaciones: ISO-2022, ISO-8859-1 hasta ISO-8859-9, ISO-8859-13 hasta ISO-8859-15. |
JIS
|
El JIS (Japanese Industrial Standards), que es el encargado de especificar los estándares industriales usados en Japón, creo las siguientes codificaciones: JIS X0201, JIS X0208. JIS X0212, JIS X0213 y el JIS X0202 conocido como el ISO-2022-JP. |
KOI8
|
Codificación de caracteres de 8 bits, diseñado para el idioma ruso, alfabeto cirílico, el idioma búlgaro. Una derivación es el KOI8-U, que agrega caracteres para el idioma ucraniano. |
TIS-620
|
Es el código de caracteres más común usado para el idioma Thai. (Tailandia) |
Windows code pages
|
Windows creo estas codificaciones usados en distintos lugares o países, que los agrupo en varios códigos de página y que se conocieron como códigos de página ANSI. Algunas variantes de estas codificaciones son: Win-1250, Win-1251, Win-1252, Win-1253, Win-1254, Win-1255, Win-1256, Win-1257, Win-1258, etc. Windows por compatibilidad también definió los códigos de página OEM, los códigos de páginas OEM son algunos de los códigos de página creados por IBM. |
Debido a la cantidad enorme de codificación de caracteres que se crearon, un grupo de fabricantes de computadoras y programas, universidades y profesionales, se decidieron por crear los códigos UNICODE. Unicode originalmente fue diseñado para usar un código digital de 16 dígitos binarios, pero actualmente fue extendido a 24 dígitos binarios para representar sólo caracteres desde 0 hasta 1 114 112. (Desde $000000 hasta $10FFFF en hexadecimal.). Estos códigos de 24 dígitos binarios se definen en Unicode como puntos de código. Los puntos de código de Unicode están divididos en 16 planos. Uno de ellos es el Plano 0, conocido como BMP (Basic Multilingual Plane) que se usa para representar 65536 caracteres, desde 0 hasta 65535 (16 dígitos binarios). Debido a que muchos sistemas informáticos no manejan la información en puntos de código de 24 dígitos binarios, Unicode define tres formas de codificación de caracteres UTF8, UTF16 yUTF32 en donde las siglas UTF significan "Unicode transformation format" que en español sería Formatos de Transformación Unicode.
‒ UTF8
Es una codificación de caracteres de longitud variable para los puntos de código de 24 dígitos binarios de Unicode. Esta codificación de caracteres de longitud variable permite representar caracteres en una secuencia de 1 a 4 bytes. Una propiedad importante de la codificación es que los dígitos binarios iniciales de una secuencia de 1 a 4 bytes, determinan la longitud en bytes de la secuencia. Es decir si la secuencia empieza con el digito binario 0, entonces es de un byte; si la secuencia empieza con los dígitos binarios 110 entonces es de dos bytes; si la secuencia empieza con los dígitos binarios 1110 entonces es de 3 bytes; y por último si la secuencia empieza con los dígitos binarios 11110 entonces es de 4 bytes. Los bytes siguientes al primer byte de una secuencia mayor a 1 byte, siempre empiezan con los dígitos binarios 10.
La tabla a continuación, resume la forma de codificación del rango de los puntos de código desde $000000 hasta $10FFFF en hexadecimal. La letra x indica los dígitos binarios disponibles para codificar el punto de código de Unicode.
Rango de los puntos de código Unicode.(hexadecimal) | UTF8 secuencia de bytes.(binario) |
$000000 hasta $00007F |
0xxxxxxx |
$000080 hasta $0007FF |
110xxxxx 10xxxxxx |
$000800 hasta $00FFFF |
1110xxxx 10xxxxxx 10xxxxxx |
$010000 hasta $10FFFF
|
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
A continuación unos ejemplos de codificación:
Caracter = Punto de código (hexadecimal) = binario | UTF8 secuencia de bytes. (binario) |
{ = $00007B = 00000000 00000000 01111011 |
01111011 |
£ = $0000A3 = 00000000 0000000010100011 |
11000010 10100011 |
ñ = $0000F1 = 00000000 0000000011110001
|
11000011 10110001
|
€ = $0020AC = 00000000 00100000 10101100
|
11100010 10000010 10101100
|
マ = $00FF8F = 00000000 11111111 10001111
|
11101111 10111110 10001111
|
𤭢 = $024B62 = 00000010 01001011 01100010
|
11110000 10100100 10101101 10100010 |
‒ UTF16
Esta codificación de caracteres de longitud variable permite representar caracteres en una secuencia de 2 a 4 bytes. Cada punto de código entre $000000 y $00FFFF en hexadecimal se codifica, sin cambios, utilizando 2 bytes (16 dígitos binarios). Este rango se corresponde con el Plano 0 (BMP), por lo que la gran mayoría de los caracteres de uso común se codifican con 16 dígitos binarios. Para los códigos mayores a $00FFFF en hexadecimal se codifican en 4 bytes. A continuación una tabla, que resume la forma de codificación del rango de los puntos de código desde $000000 hasta $10FFFF:
Rango de los puntos de código Unicode. (hexadecimal) | UTF16 |
$000000 hasta $00FFFF |
No se codfican. Ejemplo: caracter = €. punto de código = $0020AC |
$010000 hasta $10FFFF
|
En este caso se usan cuatro bytes y se procede de acuerdo al siguiente ejemplo: caracter = 𤭢 punto de código = $024B62 proceso de codificación: 1) Restar $10000 en hexadecimal. $024B62-$10000 = $14B62 binario = 00000001 01001011 01100010 2) Ubicar los bits en 110110xx xxxxxxxx 110111xx xxxxxxxx binario = 11011000 01010010 11011111 01100010 hexadecimal = $D852DF62 |
‒ UTF32
Esta codificación es de longitud fija, permitiendo colocar todos los puntos de código sin necesidad de transformar o convertir. Su longitud es de 4 bytes (32 dígitos binarios).
‒ BOM Byte Order of Mark.
Son una secuencia de códigos que nos permite identificar si un archivo de texto o flujo de caracteres esta codificado en UTF8, UTF16, o UTF32, la siguiente tabla describe su significado y su uso. El BOM siempre debe estar al inicio de un archivo de texto o flujo de caracteres.
BOM valores en hexadecimal | Descripción |
EF BB BF
|
Para identificar si el archivo o flujo de caracteres es UTF8 |
FE FF |
Para identifcar si el archivo o flujo de caracteres es UTF16 Big Endian, con los bytes en orden natural. Ejemplo: caracter = 𤭢 punto de código = $024B62 UTF16 Big Endian = $D852DF62 |
FF FE
|
Para identifcar si el archivo o flujo de caracteres es UTF16 Little Endian, con los bytes en orden inverso. Ejemplo: caracter = 𤭢 punto de código = $024B62 UTF16 Little Endian = $52D862DF |
0000 FEFF
|
Para identifcar si el archivo o flujo de caracteres es UTF32 Big Endian, con los bytes en orden natural. Ejemplo: caracter = 𤭢 punto de código = $024B62 UTF32 Big Endian = $00024B62 |
FFFE 0000
|
Para identifcar si el archivo o flujo de caracteres es UTF32 Little Endian, con los bytes en orden inverso. Ejemplo: caracter = 𤭢 punto de código = $024B62 UTF32 Little Endian = $624B0200 |
Los sistemas operativos son los encargados de implementar y ofrecer una codificación de caracteres a usar por los programas. Actualmente la mayoría de los Sistemas Operativos ofrecen codificación de caracteres en Unicode. Usando las otras codificaciones de caracteres para compatibilidad con programas antiguos.