BotonMenu
BotonIndice

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL


7. INTRODUCCIÓN A LOS PUNTEROS Y VARIABLES DINÁMICAS.
7.6. ANSISTRING Y UNICODESTRING.
7. INTRODUCCIÓN A LOS PUNTEROS Y VARIABLES DINÁMICAS.
7.6. ANSISTRING Y UNICODESTRING.
7. INTRODUCCIÓN A LOS PUNTEROS Y VARIABLES DINÁMICAS.
7.6. ANSISTRING Y UNICODESTRING.

SIGUIENTE

SIGUIENTE

SIGUIENTE


‒ AnsiString y UnicodeString.

AnsiString y UnicodeString, nos permiten crear variables dinámicas de cadenas de caracteres. Cuando se asigna una cadena vacía (""), entonces los punteros tienen el valor NIL, pero si se asigna una cadena de caracteres, entonces el puntero apunta a una estructura (registro) en la memoria, tal como se muestra en el siguiente cuadro:

Posición Descripción

-8 bytes atras

Longint, con el contador de referencias. (reference count)

-4 bytes atras

Longint, con el tamaño actual en bytes de la memoria utilizada por la variable dinámica.

0

Cadena de caracteres actual, en el caso de ansistring caracteres de 1 byte, en el caso de UnicodeString caracteres de 2 bytes.

Esta estructura es de uso interno del compilador, por lo que no es recomendado acceder a ella, ya que es posible que en versiones futuras del compilador esta cambie o sea diferente a versiones anteriores.

Estos tipos de datos funcionan como un tipo de dato string, esto quiere decir que se pueden usar las funciones y procedimientos, que se usan con los tipos de datos string. Pero en el caso de las rutinas write, writeln, read y readln, el tipo de dato Unicodestring no trabaja con read y readln. Los tipos de datos AnsiString y UnicodeString, nos permiten crear variables que pueden almacenar más de 255 caracteres, el límite máximo de caracteres lo determina la cantidad de memoria disponible que tenga la computadora que se esté usando. Para saber la cantidad de caracteres, se debe usar la función length. A continuación un ejemplo del uso de Length:


Descargar
{$codepage UTF8}
VAR

  ACad:AnsiString;
  UCad:UnicodeString;

BEGIN

  ACad:='Hola';
  Writeln(length(ACad));
  UCad:='Hola';
  Writeln(length(UCad))
  
END.
Código fuente 16: Ejemplo del uso de AnsiString y UnicodeString.
Descargar

Para acceder a los caracteres de un AnsiString y UnicodeString, se procede del mismo modo como el tipo de dato String, a continuación un Ejemplo en Linux:


Descargar
{$codepage UTF8}
USES cwstring;
VAR

 ACad:AnsiString;
 UCad:UnicodeString;
 i:byte;
   
BEGIN

 ACad:='Hola';
 UCad:='こんにちは';
 for i:=1 to length(ACad) do Write(ACad[i]);
 Writeln;     	 
 for i:=1 to length(UCad) do Write(UCad[i]);
 
END.
Código fuente 17: Ejemplo en Linux, de como acceder a un caracter de un UnicodeString y AnsiString.
Descargar

Si se desea probar el programa anterior en Windows, sólo debe comentar el uso de la unidad cwstring.

Se pueden asignar variables de los tipos de datos String, PChar, PWideChar y UnicodeString a una variable de tipo de dato Ansistring, teniendo en cuenta que cuando se asignen variables de los tipos de datos PWideChar y UnicodeString el Administrador de caracteres se encargará de hacer las conversiones necesarias. Del mismo modo se pueden asignar variables de los tipos de datos String, AnsiString, PChar, PWideChar a una variable de tipo de dato UnicodeString. A continuación un ejemplo en Linux:


Descargar
{$codepage UTF8}
USES cwstring;
VAR ACad:AnsiString;  
    Cad:String;
    PCad:PChar;
    PWCad:PWidechar;
    UCad:UnicodeString;
	
BEGIN

  Cad:='Hola';
  PCad:='Hola';  
  PWCad:='こんにちは';
  UCad:='こんにちは';
  
  ACad:=Cad;
  Writeln(ACad);
  ACad:=PCad;
  Writeln(ACad);
  ACad:=PWCad;
  Writeln(ACad);
  ACad:=UCad;
  Writeln(ACad);
  
  ACad:='Hola';
  
  UCad:=Cad;
  Writeln(UCad);
  UCad:=ACad;
  Writeln(UCad);
  UCad:=PCad;
  Writeln(UCad);  
  UCad:=PWCad;
  Writeln(UCad)
  
END.
Código fuente 18: Ejemplo de varias asignaciones a UnicodeString y AnsiString.
Descargar

Cuando se asigna un AnsiString ó un UnicodeString, a una variable de tipo String, se debe tener en cuenta el tamaño de la variable de tipo String. Una variable de tipo String siempre tendrá un tamaño máximo o menor de 255 caracteres, haciendo que los caracteres se trunquen cuando se asignan cadenas de caracteres de mayor longitud a lo soportado por este tipo de dato.

Cuando se asigna un AnsiString a un PChar, se debe hacer a través de un solapamiento lo mismo ocurre cuando se asigna un UnicodeString a un PWidechar. A continuación el ejemplo en Linux:


Descargar
{$codepage UTF8}
VAR ACad:AnsiString;
    UCad:UnicodeString;  
    
    Cad:String;
    PCad:PChar;
    PWCad:PWidechar;
  
    i:byte;
BEGIN

  UCad:='こんにちは';
  ACad:='Hola';  
 
  PCad:=PChar(ACad);
  Writeln(PCad); 
  
  PWCad:=PWideChar(UCad);
  for i:=0 to length(PWCad) do
    Write(WideChar(PWCad[i]));
  Writeln; 
  
END.
Código fuente 19: Ejemplo de asignación de AnsiString y UnicodeString a un PChar y PWideChar.
Descargar

Del ejemplo anterior se puede observar que estoy usando un bucle for para mostrar la cadena de caracteres PWCad, esto es debido a que las rutinas write y writeln, no permiten mostrar los caracteres de los tipos de datos PWideChar.

Por razones obvias no es adecuado asignar un UnicodeString a una variable de tipo PChar, usando solapamiento; esto es debido a que la representación interna de los caracteres de un UnicodeString es de dos bytes y el de un PChar es de un byte, haciendo que se interprete un carácter de 2 bytes (Widechar) como dos caracteres de 1 byte (char), algo parecido sucede en el caso de asignar un AnsiString a una variable de tipo PWideChar, en donde dos caracteres de 1 byte (char), serán interpretados como un carácter de 2 bytes. (Widechar)

El procedimiento SetLength, se puede usar para crear un ansistring o unicodestring, definiendo la cantidad de caracteres a usarse en la variable, del sig. iendo modo


Descargar
{$codepage utf8}

VAR

 cad1:ansistring;
 cad2:unicodestring;
 i:longword;
 
BEGIN

 setlength(cad1,50);
 setlength(cad2,50);
 for i:=1 to length(cad1) do cad1[i]:='x';
 for i:=1 to length(cad2) do cad2[i]:='z'; 
 Writeln(cad1);
 Writeln(cad2)
 
END.
Código fuente 20: Ejemplo del uso de SetLength con AnsiString y UnicodeString.
Descargar

Aunque usar un bucle para rellenar del mismo carácter toda la cadena de caracteres, no resulta muy conveniente, se puede usar en su lugar StringOfChar, del siguiente modo:


Descargar
{$codepage utf8}

VAR

 cad1:ansistring;
 cad2:unicodestring; 
 
BEGIN

 cad1:=StringOfChar('x',50);
 cad2:=StringOfChar('z',50);
  
 Writeln(cad1);
 Writeln(cad2)
 
END.
Código fuente 21: Ejemplo del uso de StringOfChar.
Descargar

En la teoría se pueden crear variables dinámicas ansistring y unicodestring de 4GiB (232 caracteres en ansisstring y 231 caracteres en unicodestring) en sistemas operativos de 32 bits (Windows o Linux), y mucho más en sistemas operativos de 64 bits, en la práctica esto no siempre será posible ya que todo depende de cómo este configurado el sistema operativo (Windows o Linux) y de cuanta memoria se dispone, lo recomendado es crear variables que usen la cantidad necesaria de acuerdo al análisis del problema que se quiera solucionar, teniendo en cuenta la memoria disponible de la computadora. Las variables de tipo Unicodestring y Ansistring pueden declararse con un valor inicial, tal como se hacen con las variables de tipo string. En el caso de ansistring sólo se deben usar caracteres en una codificación de caracteres de longitud fija de 8 bits, es decir no se puede usar UTF8. Ejemplo:


Descargar
{$codepage utf8}

VAR

 cad1:ansistring='Hola'; //No se puede usar Unicode
 cad2:UnicodeString='①②③④⑤⑥⑦⑧⑨⑩ - Hola - ①②③④⑤⑥⑦⑧⑨⑩';
 
BEGIN
  
 Writeln(cad1);
 Writeln(cad2)
 
END.
Código fuente 22: Ejemplo del uso de StringOfChar.
Descargar


Última revisión: 10/12/2013.



SIGUIENTE
SIGUIENTE
SIGUIENTE


 
‒ Comentarios y sugerencias.

Agradezco de antemano, todo comentario, sugerencia, y donativo (a través de Paypal me), 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.








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.