[Lazarus-es] Fw: Salvar cadena UTF8 en Firebird con Characterset ISO8859_1

Jesus Reyes jesusrmx en yahoo.com.mx
Mar Dic 15 20:44:34 CET 2009



--- El mar 15-dic-09, Ismael L. Donis Garc?a <ismael en citricos.co.cu> escribió:

> De:: Ismael L. Donis Garc?a <ismael en citricos.co.cu>
> Asunto: Re: [Lazarus-es] Fw: Salvar cadena UTF8 en Firebird con Characterset ISO8859_1
> A: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org>
> Fecha: martes 15 de diciembre de 2009, 11:39
> Ante tremendo enredo no sería mejor

Tal enredo es solo imaginario.

> implementar alguna función para usar 
> solo una conexión? En lo personal no me gusta eso de las 2
> conexiones.
> 

Tambien creo que eso de tener dos conexiones para este proposito no es lo mas aconsejable.

> Creo que he caído de nuevo en el aspecto que no estoy de
> acuerdo contigo de 
> que el componente TIBConneciton está mal implementado.
> 

No esta mal implementado. Si acaso el soporte esta incompleto, pero esa es otra historia que no tiene nada que ver con el problema que se te ha presentado.

> Debía tener 2 propiedades CharSet una para visualizar los
> datos y otra para 
> salvar en la base de datos.
> 

Tienes una base de datos que usa el encoding ISO8859_1?, esta perfecto, los componentes sqldb pueden con eso, lazarus puede con eso solo se necesita que tu puedas con eso.

Primero, si pones en la conexion (TIBConnection) el charset UTF8, todo esta resuelto. Simplemente, la conexion (es decir el componente TIBConnection) no manipula los datos, es el servidor firebird que se hara cargo de todo. 

Es decir, y esto ya se te ha comentado, *firebird* convertira *automaticamente* cualquier informacion que le des en UTF8 al encoding de la base de datos ISO8859_1, simetricamente, al extraer datos de la base de datos codificada en ISO8859_1, *firebird* los convertira al charset especificado en la conexion, es decir UTF8.

Eso si, al especificar UTF8 en charset, adquieres el compromiso de unicamente enviarle al servidor informacion codificada en UTF8, nada de unas cosas en UTF8 y otras en ISO8859_1. simetricament, cuando extraigas datos de la base de datos, siempre obtendras informacion codificada en UTF-8, no unas cosas en UTF-8 y otras en ISO8859_1

Por eso lo primero que deberias hacer es una revision de tu codigo. Verifica que siempre uses UTF8 en todo, Lazarus te la pone facil aqui, pues usa UTF8 en todo. Si a fuerzas quieres usar ISO8859_1, eso es nadar contra la corriente. (notese que quizas hay la forma de hacer que lazarus funcione con ISO8859_1 en lugar de UTF8, pero de eso mejor ni hablar pues ya no esta soportado). O sea si usas funciones como UTF8ToAnsi o similares para convertir a ISO8859_1 y de paso le mandas eso al servidor, no esperes milagros.

Ahora, si especificas ISO8859_1 como charset en TIbConnection (o no pones nada en charset que si estoy en lo correcto viene a ser lo mismo pues creo, usa el encoding de la base de datos) pues no esta bien. Eso quiere decir que has adquirido la responsabilidad de enviarle a la base de datos informacion codificada en ISO8859_1, mientras que es posible hacer eso en Lazarus, la verdad es que nadas contra la corriente pues ahora debes convertir todo usando UTF8ToAnsi en todo lo cual es mas trabajo. Por favor, no trabajen de mas :D.

¿Por que da la impresion de que funciona?, simplemente, a excepcion de unos cuantos caracteres (ver tabla ISO8859_1) todos los demas son validos en ese encoding. es decir que probablemente cualquier cadena UTF-8 es valida en ISO8859_1. Con esto en mente si en tu base de datos defines un campo como Char(1), y quieres introducir una cadena UTF-8 como  'á' ahi, claro que no va a caber, pues la cadena UTF-8 'á' ocupa 2 caracteres.


> Saludos cordiales
> =========
> ¦¦ ISMAEL ¦¦
>

Jesus Reyes A.


      ¡Obtén la mejor experiencia en la web! Descarga gratis el nuevo Internet Explorer 8. http://downloads.yahoo.com/ieak8/?l=mx




More information about the Lazarus-es mailing list