[Lazarus-es] Codificación de caracteres

José Mejuto joshyfun en gmail.com
Vie Nov 12 16:35:11 CET 2010


Hello Ismael,

Friday, November 12, 2010, 3:52:42 PM, you wrote:

ILDG> José disculpa que discrepe contigo, pero no recomiendo para nada usar
ILDG> charset NONE porque eso te podría traer problemas de conversión.

ILDG> Ya la compatibilidad de Firebird con Interbase se ha roto en las nuevas
ILDG> versiones. Si quieres mover datos de un sistema a otro mejor lo haces a
ILDG> través de consultas. Eso sin preguntarme para que querer migrar a un sistema
ILDG> propietario.

No, no es eso, me refería a que el IBConnection de Lazarus no soporta
bien campos en charset UTF8, de hecho lo hace muy mal :) creo que por
compatibilidad con Interbase.

Para usarlos bien, no queda más remedio que usar CHARSET NONE, cosa
que no me gusta, pero es lo que hay.

Demostración, crea un campo UTF8 en firebird de 20 characters de
tamaño, verás que ocupa 20*4 bytes en la base de datos, ya que cada
UTF8 char puede tener hasta 4 bytes para codificarse. Bien, eso quiere
decir que el datalen del campo son 20 y el datasize son 80 bytes. Ahora
intenta actualizar ese campo poniendo como charset UTF8 en el
IBConnection, y hazlo metiendo un campo de 20 caracteres UTF8 de una
"Ñ", verás que te da error, por que la cadena UTF8 ocupa 40 bytes y 20
chars, pero como 40 bytes es superior a 20 datalen, crack!. Para ello
hay que detectar que el campo usa codificación UTF8 (no recuerdo el
código interno) y usar el datasize en vez del datalen en ese caso.

El problema de usar NONE es que tienes que asegurarte de que mandas lo
que hay que mandar. En mi caso, todos los campos de texto son UTF8 así
que no representa ningún problema usar NONE. Si tuviera una mezcla si
que podría tenerlos, y se complicaría la cosa bastante.

-- 
Best regards,
 José





More information about the Lazarus-es mailing list