BotonMenu
BotonIndice

Visita : conoce3000.com
Paypal : https://www.paypal.com/donate/?hosted_button_id=XY8TZ3MGN64GE

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL


2. TIPOS DE DATOS SIMPLES.
2.6. ADMINISTRADOR DE CARACTERES (WIDESTRING MANAGER).
2. TIPOS DE DATOS SIMPLES.
2.6. ADMINISTRADOR DE CARACTERES (WIDESTRING MANAGER).
2. TIPOS DE DATOS SIMPLES.
2.6. ADMINISTRADOR DE CARACTERES (WIDESTRING MANAGER).

SIGUIENTE

SIGUIENTE

SIGUIENTE


‒ Administrador de Caracteres (Widestring Manager).

El Widestring Manager o Administrador de caracteres son un conjunto de rutinas que se encargan de la conversión de caracteres entre codificaciones de caracteres de longitud variable y longitud fija de 8, 16, 32 o más dígitos binarios. Colocando un signo de interrogación al carácter que no se puede representar en la conversión.

Como nuestros códigos fuente se escriben en UTF8, entonces los caracteres UTF8 que se asignen a una variable de tipo char o ansichar, primero son convertidos de UTF8 a UTF16, para luego ser evaluados y convertidos por el administrador de caracteres a un carácter en la codificación de caracteres que use el Sistema Operativo, en caso de no ser representable entonces asigna un signo de interrogación ?=#$3F. Windows permite usar dos sistemas de codificaciones los códigos de página ANSI y los códigos de página OEM, en Windows el administrador de caracteres trabaja con los códigos de página ANSI cuando se muestran caracteres en el interprete de comandos, pero cuando se hace una lectura de datos desde el interprete de comandos, entonces usan los códigos de página OEM; en Linux sólo se usa la codificación de caracteres UTF8, tanto para mostrar como para hacer una lectura desde el interprete de comandos.

El Administrador de caracteres está incluido por defecto en los programas compilados en Windows, pero no en los programas compilados en Linux. En Linux cuando no se usa el administrador de caracteres, los programas verificarán si el carácter UTF8, que se asigna a una variable de tipo char es mayor a 255 ó #$00FF en UTF16, y si este es mayor entonces asignará un signo de interrogación. Para entender mejor lo explicado, veamos a continuación los ejemplos.

Si en nuestro código fuente, escrito en UTF8, asignamos el símbolo € (Euro) a una variable de tipo char ó ansichar, el compilador primero convierte el código #$E282AC del Euro en UTF8 a #$20AC en UTF16, y luego el administrador de caracteres buscara si el código #$20AC es representable en la codificación de caracteres del sistema operativo, en mi computadora será Win-1252, asignando de esta manera el código #$80, a la variable de tipo char. Si hacemos lo mismo en Linux, y asignamos el símbolo del Euro (€) a una variable de tipo char, el compilador convierte el código #$E282AC en UTF8 a #$20AC en UTF16, y verifica si el código es menor a #$00FF, pero al no serlo asigna un signo de interrogación. Pero si se asigna un símbolo como el siguiente ideograma japonés: 石, en Windows el administrador de caracteres, al no encontrarlo en la codificación de caracteres Win-1252 de mi computadora, le asigna un signo de interrogación; pero en Linux le asigna un signo de interrogación porque su código es mayor al código #$00FF. Ejemplo:


Descargar
{$codepage UTF8}

VAR letra01 :char;

BEGIN
  // En UTF-8 #$E282AC representa el €
  // En BMP es #$20AC.
  // Asigna #$80 si el S.O. usa Win-1252
  // En Linux asigna signo de interrogación, porque es mayor a #$00FF
  letra01:='€'; 
  Writeln(letra01);

  // En UTF-8 #$E79FB3 representa el 石
  // En BMP es #$77F3
  // Asigna signo de interrogacion si el S.O. usa Win-1252
  // En Linux asigna signo de interrogación, porque es mayor a #$00FF
  letra01:='石';
  Writeln(letra01);

  // En UTF-8 #$C3B1 representa la ñ 
  // En BMP es #$00F1 
  // Asigna #$F1 si el S.O. usa Win-1252
  // En Linux asigna #$F1 el segundo byte, porque es menor a #$00FF  
  letra01:='ñ';
  Writeln(letra01)   
END.
Código fuente 6: Asignando caracteres en UTF8 a variables de tipo char o ansichar.
Descargar

El programa anterior mostrará dos signos de interrogación en Linux, uno por el € y otro por el ideograma japonés 石, pero por la letra ñ no se mostrará nada, la razón es que el interprete de comandos de Linux usa UTF8, y el código #$F1 no es un caracter visible en esa codificación de caracteres.

En los programas compilados en Linux el Administrador de caracteres no se incluye por defecto, por lo que es necesario incluirlo, con el uso de la palabra reservada uses, del siguiente modo: Uses cwstring;. La palabra reservada uses, sirve para indicarle al programa que unidades se están usando en el programa, y las unidades son archivos que reúnen un conjunto de rutinas, operadores y tipos de datos definidos por el programador, que creó la unidad; en este caso la unidad cwstring contiene el conjunto de rutinas que usa el administrador de caracteres en Linux. Ejemplo:


Descargar
{$codepage UTF8}

USES cwstring;

VAR Ideograma : char;
    letra : char; 

BEGIN
  letra:='ñ';         // #$00F1 en BMP, #$C3B1 en UTF8 asigna ?, en Linux 
  Writeln(letra);
  letra:='ÿ';         // #$00FF en BMP, #$C3BF en UTF8 asigna ?, en Linux 
  Writeln(letra);
  Ideograma:='石';    // #$77F3 en BMP, Ideograma Japones. Asigna ?, en Linux
  Writeln(Ideograma);
END.
Código fuente 7: Uso de la unidad cwstring en Linux con el tipo de dato char.
Descargar

Al usar la unidad cwstring o el Administrador de caracteres en Linux, del programa anterior se puede observar que cuando se asigne un carácter en UTF8 con un código UTF16 o punto de código mayor a 127, a una variable de tipo char; entonces el administrador de caracteres asignará un signo de interrogación, esto es debido a que Linux usa UTF8 como codificación de caracteres, en donde los caracteres a partir de 128 (#$80), se codifican usando 2 bytes. Es decir, cuando asignamos la letra ñ con código #$C3B1 en UTF8 a una variable de tipo char, hará que el administrador de caracteres asigna un signo de interrogación, porque el carácter UTF8 usa dos bytes y no alcanza para colocarlo en una variable de tipo char que es de 1 byte.

Las rutinas Write y Writeln sólo permiten mostrar una secuencia de caracteres, que sean representables en una codificación de caracteres de 8 dígitos binarios, y cuando se usan variables de tipo Widechar con estas rutinas entonces el administrador de caracteres convertirá el carácter a la codificación de caracteres que use el Sistema Operativo, en caso de no ser representable entonces asigna un signo de interrogación #$3F. En Linux, cuando se usa el administrador de caracteres este se encargará de convertir el carácter en UTF16 a UTF8, y enviarlo a las rutinas write y writeln, como si se tratase de una cadena de caracteres de 1 byte. Ejemplo:


Descargar
{$codepage UTF8}

USES cwstring;

VAR a,b,c,d,e,f:widechar;

BEGIN
  a:='E';        //#$0045 en UTF8, #$0045 en BMP
  Writeln(a);    


  b:='€';        //#$E282AC en UTF8, #$20AC en BMP
  Writeln(b);    


  c:='Ж';        // #$D096 en UTF8, #$0416 en BMP
  Writeln(c)  


  d:='ñ';        // #$C3B1 en UTF8, #$00F1 en BMP
  Writeln(d);
  
  e:='ÿ';        // #$C3BF en UTF8, #$00FF en BMP 
  Writeln(e);  


  f:='石';       // #$E79FB3 en UTF8, #$77F3 en BMP 
  Writeln(f);
END.
Código fuente 8: Uso de la unidad cwstring en Linux.
Descargar

Como el Sistema Operativo Linux trabaja con UTF8, entonces el administrador de caracteres usara esta codificación para las conversiones. Al usar widechar con las rutinas write y writeln, el administrador de caracteres hará la conversión de UTF16 a la codificación de caracteres UTF8 de Linux. Al convertir el carácter UTF16 a UTF8, este se expande a una cadena de caracteres, y entonces se enviará a la rutina write y writeln, una secuencia de caracteres todas de 1 byte. Por ejemplo en la variable b, que contiene el Euro almacenado en UTF16 cómo #$20AC, la rutina Writeln recibe el código y entonces el administrador de caracteres hará la conversión de UTF16 a UTF8, enviando el carácter UTF8 #$E282AC, como una secuencia de 3 caracteres de 1 byte al intérprete de comandos de Linux.

Las rutinas read y readln, cuando hacen una lectura desde el intérprete de comandos de Linux que usa UTF8, sólo guardarán el primer byte del carácter UTF8 ingresado, en la variable de tipo char o ansichar. Ejemplo:


Descargar
{$codepage UTF8}

USES cwstring;

VAR letra01 : ansichar;

BEGIN
 Write('Ingrese un letra: ');
 Readln(letra01);
 Writeln('Letra ingresada: ',letra01)
END.
Código fuente 9: Lectura de caracteres en UTF8.
Descargar

Del programa anterior, si ingresamos caracteres UTF8, como la letra ñ en donde su código es $C3B1, entonces readln, sólo asignará el primer byte $C3 a la variable letra01, ignorando el resto. Lo mismo sucede con caracteres como el Euro, que tiene como código 3 bytes en UTF8: $E282AC, en donde se almacenará en la variable letra01 el valor $E2. Al ser $C3 y $E2, valores no válidos en UTF8, entonces el interprete de comandos en Linux no mostrará nada.

En Windows, el intérprete de comandos no tiene un soporte adecuado para UTF8, por lo que el resultado siempre será impredecible, cuando se ingresen caracteres UTF8 de una longitud mayor de 2 bytes. Pero cuando el intérprete de comandos de Windows usa una codificación de caracteres de 8 dígitos binarios, y se hace una lectura con read o readln, entonces el administrador de caracteres usará la codificación de caracteres (códigos de pagina OEM) del intérprete de comandos para hacer las conversiones. Es decir, si el programa anterior usa en el interprete de comandos la codificación de caracteres IBM 437 (chcp 437), entonces cuando se ingrese el €, este se almacenará con un signo de interrogación, ya que el Euro no existe en IBM 437.




SIGUIENTE
SIGUIENTE
SIGUIENTE


 
‒ Comentarios y sugerencias.

Agradezco de antemano, todo comentario, sugerencia, y donativo a través de , que ayude a mejorar los contenidos educativos de Conoce 3000. Además, cualquier pregunta o duda que tengas lo puedes hacer por este medio. Pero, todo contenido que pueda resultar ofensivo, malicioso, racista, sexista, discriminatorio, obsceno, vulgar será eliminado. Para clases particulares contactame por whatsapp al 📲 (+51) 999 264 073








PORTADA |  INTERESANTE |  APUNTES |  LIBROS |  GALERIA


Creative Commons License


Todos los textos, imágenes y videos de Conoce3000 estan colocados bajo una licencia : Creative Commons Reconocimiento-NoComercial 3.0 Unported License.