[Lazarus-es] La letra Ñ

José Mejuto joshyfun en gmail.com
Vie Ago 6 00:49:14 CEST 2010


Hello Anxo,

Thursday, August 5, 2010, 9:31:02 PM, you wrote:

AV>  a:=UTF8ToISO_8859_1('Ñ')[1];
AV>  Edit1.Text:=IntToStr(Length(a)); //debería ser 1
AV>  b:=ISO_8859_1toUTF8(a);
AV>  Edit2.Text:=IntToStr(Length(b)); //debería ser 2
AV>  Edit3.Text:=ISO_8859_1toUTF8(a); //Debería poner una Ñ
AV> escrito por ti y editado con Kwrite lo confirma.
AV> He probado:

Bueno, al pasarlo por KWrite o lo que sea te puede haber grabado la
"Ñ" (bueno, a ti te sale en el email una A con ~ arriba) en codepage o
en UTF8, eso a la hora de generar código es un problema, por que los
literales no sabes como los está codificando el editor, por lo tanto o
bien miras con un editor hexadecimal como lo graba tu editor o bien
usas charcodes "#" en el código.

AV>   tmp := UTF8ToISO_8859_1('Ñ')[1];
AV>  a_mayu[20] := tmp[1];
AV>  Label1.Caption:=UTF8ToAnsi('Ñ')[1];
AV>  Label5.Caption:=tmp;
AV>  Label38.Caption:=AnsiToUTF8('Ñ')[1];
AV>  Label39.Caption:=ISO_8859_1ToUTF8('Ñ')[1];

Reemplacemos las 'Ñ' por charcodes y te olvidas del problema :)

Label39.caption:=ISO_8859_1ToUTF8(#$D1);

Debería salirte una Ñ en el 39.

AV> Siempre el mismo resultado: ¡¡ Mi rectangulo favorito !!.

No he probado, pero casi seguro que no ;)

AV> Hice un dpkg-reconfigure locales y probé varias combinaciones, finalmente
AV> dejé:
AV> *es_ES ISO-8859-1* y *es_ES.UTF8 UTF8*
AV> Lo máximo que conseguí fué sustituir mi cuadradito por una interrogación.

Usa siempre el segundo, te evitarás problemas.

AV> Efectivamente la aplicación es para el GUI.
AV> No entiendo muy bien por que dices que no debería usar codepages, yo no
AV> conozco otra manera más sencilla de generar el alfabeto castellano que con:
AV>   *for car := 'A' to 'Z' do*
AV> Si la hay me gustaría conocerla.

No es cuestión de sencillez, si no de funcionamiento. Tu programa (el
que sea) te funcionará bien donde usen codepages ISO8859-1, o sea,
buena parte de Europa y creo que toda sudamérica, pero en el resto de
paises verán cosas raras en vez de 'Ñ' o letras acentuadas, y lo que
es peor, en algunos casos verán letras diferentes.

Con UTF8 (Unicode) no pasa eso, ya que hay definidos unos 13 millones
de letras de prácticamente todos los idiomas del mundo (si el que te
gusta no está incluido, hay un espacio reservado para especiales como
el Klingon de Star Trek).

El problema con el Unicode es que para manejar carácter a carácter
necesitas 32 bits por letra, lo que es un desperdicio de espacio
brutal, así que se suele usar el UTF-16 o UTF-8, el primero usa 2
bytes para las primeras 60000 letras y el resto que son raras usa una
composición de otros 2 bytes. El UTF8 usa 1,2,3 o 4 bytes, y es un
poco complicada de usar carácter a carácter sin unas bibliotecas de
manejo, pero es lo que más se parece a codepage.

Lazarus y la LCL trabajan exclusivamente en UTF8, por eso tienes que
darle las letras en UTF8 o si no te salen cuadraditos.

Tienes de desechar la idea de que una letra es un byte, una letra es
una secuencia de bytes de longitud indeterminada (una string) y
usarlas de ese modo para que las cosas funcionen de un modo
internacional sin problemas. Yo hace ya 3 años que sólo trabajo con
UTF8 de modo exclusivo.

-- 
Best regards,
 José





More information about the Lazarus-es mailing list