Page 1 of 1

Mapa caracteres Harbour

PostPosted: Thu Jun 26, 2014 10:17 pm
by Manuel Valdenebro
En una aplicación que estoy convirtiendo de xHarbour a Harbour, me encuentro con la siguiente sorpresa:

En una dbf, tengo un campo carácter, donde grabo una información. Esta información en un número encriptado con una función propia que posteriormente desencripto con otra función propia, como método de control.

En el campo de la dbf hay guardado esta información }¡©¯¤©µ° que corresponden a los caracteres 125+161+169+175+164+169+181+176 y que al convertir, dan el numero 22641247. En xHarbour funciona perfectamente tanto la encriptación, como la desencriptación.

Al leer esta información con Harbour la cosa cambia y los caracteres que lee Harbour son 125+237+169+187+241+169+181+176

Es decir, ha cambiado el segundo, cuarto y quinto caracter con lo cual, al realizar la conversión saca una información errónea. La sorpresa es que tambien al encriptar con Harbour graba una información encriptada diferente que tampoco coincide al desencriptar con Harbour.

¿Porque esta variación de xHarbour a Harbour? ¿ Son los codepages de Harbour diferentes a los de xHarbour? ¿Utiliza una tabla de español distinta que xHarbour?

Observo que algunos caracteres son netamente del español, por ejemplo el segundo (¡) y el quinto que saca Harbour es la ñ (241).

Re: Mapa caracteres Harbour

PostPosted: Thu Jun 26, 2014 10:27 pm
by Antonio Linares
Manuel,

Puedes proporcionar un ejempo de cómo lo haces para probarlo ?

Re: Mapa caracteres Harbour

PostPosted: Fri Jun 27, 2014 5:52 am
by Manuel Valdenebro
En xHarbour, lo vengo haciendo de la siguiente forma:

1) Al inicio, cargo los módulos de los lenguajes

REQUEST HB_LANG_ES
REQUEST HB_LANG_DE
REQUEST HB_LANG_EN
REQUEST HB_LANG_FR
REQUEST HB_LANG_PT
REQUEST HB_LANG_IT

REQUEST HB_CODEPAGE_ESWIN // para picture @! Ññ
REQUEST HB_CODEPAGE_DEWIN // aleman
REQUEST HB_CODEPAGE_PTISO // portugues
REQUEST HB_CODEPAGE_FR850 // frances
REQUEST HB_CODEPAGE_IT850 // italiano
REQUEST HB_GT_GUI_DEFAULT // inglés

........
........

2)
// según la configuracion del usuario, pongo el idioma
HB_LangSelect(UPPER(propie->ID))

// cargo SetCodePage en el siguiente DOCASE, para la ordenación de ese idioma Y AQUI ESTA EL ERROR. Si comento el DOCASE, entonces todo correcto,pero me imagino que el SetcodePage es necesario para la ordenación

DO CASE

CASE UPPER(propie->ID) = 'ES'
HB_SetCodePage("ESWIN") // para ordenacion - requiere codepage.lib
CASE UPPER(propie->ID) = 'DE'
HB_SetCodePage("DEWIN") // para ordenacion - requiere codepage.lib
CASE UPPER(propie->ID) = 'FR'
HB_SetCodePage("FR") // para ordenacion - requiere codepage.lib
CASE UPPER(propie->ID) = 'PT'
HB_SetCodePage("PTISO") // para ordenacion - requiere codepage.lib
CASE UPPER(propie->ID) = 'IT'
HB_SetCodePage("IT850") // para ordenacion - requiere codepage.lib

ENDCASE

En el proyecto tengo incluida la librería hbcpage.lib que me imagino equivale a la codepage.lib de xHarbour.

Una vez detectado el problema, he leido algo en Harbour que tiene dos funciones para establecer el lenguaje diferentes a xHarbour: REQUEST HB_CODEPAGE y HB_cdpSelect(). Incluso el nombre de los codepage son diferentes entre Harbour y xHarbour.

¿Es esto cierto? ¿No sirven el nombre de las funciones de xHarbour en Harbour?.

Re: Mapa caracteres Harbour

PostPosted: Fri Jun 27, 2014 6:16 am
by Antonio Linares
Manuel,

Esto es algo propio de Harbour, y no de FWH, asi que lo más conveniente es que directamente publiques tu pregunta en el foro de usuarios de Harbour:

https://groups.google.com/forum/#!forum/harbour-users

Tal vez otro usuario pueda ayudarte aqui. Normalmente hacemos:

REQUEST HB_CODEPAGE_ESWIN

HB_SetCodePage("ESWIN")

Re: Mapa caracteres Harbour

PostPosted: Fri Jun 27, 2014 7:10 am
by Manuel Valdenebro
Gracias Antonio. Voy a mirar en el foro de Harbour.

Re: Mapa caracteres Harbour

PostPosted: Fri Jun 27, 2014 4:20 pm
by Manuel Valdenebro
Antonio Linares wrote:Manuel,

Esto es algo propio de Harbour, y no de FWH, asi que lo más conveniente es que directamente publiques tu pregunta en el foro de usuarios de Harbour:

https://groups.google.com/forum/#!forum/harbour-users

Tal vez otro usuario pueda ayudarte aqui. Normalmente hacemos:

REQUEST HB_CODEPAGE_ESWIN

HB_SetCodePage("ESWIN")



Según he estado leyendo en el foro de Harbour, la dbf lleva un codepage independiente. Incluso que la propia funcion DBUSEAREA() de Harbour, lleva dos parámetros adicionales no comentados y uno de ellos es para indicar la CODEPAGE de la DBF.

Si con esa configuración que indicas para español (la función HB_SetCodePage está obsoleta y recomiendan sustituirla por HB_CDPSELECT), escribes en un campo de una dbf "España" y después abres la DBF con cualquier utilidad, verás que Harbour no ha escrito "España". La ñ la sustituye por un cuadradito. Si otra aplicación ha escrito España correctamente en la dbf, cuando abres la dbf con Harbour te dira Españ+a. Es decir, hay una disparidad entre los datos reales de la dbf y los mostrados por Harbour+Fivewin. Esto no ocurre con xHarbour.

El problema está, cuando quieres tratar alguna información escrita en un campo de la dbf como chr/Asc, por ejemplo, para encriptar/desencriptar una cadena con la clave de cada usuario. Las funciones que tengo, basadas en las funciones de FWH encrip/desencrip no funcionan, porque no dan el resultado previsto.

Re: Mapa caracteres Harbour

PostPosted: Fri Jun 27, 2014 10:17 pm
by Antonio Linares
Manuel,

gracias por tu información. Seguro que una vez lo resuelvas será de gran ayuda para otros tambien :-)

Re: Mapa caracteres Harbour

PostPosted: Sat Jun 28, 2014 9:52 pm
by Manuel Valdenebro
Harbour, a diferencia de xHarbour, abre por defecto las dbf con el codepage cp437 (inglés). Si luego cambiamos el CODEPAGE a otro idioma, entonces graba la información en ese fichero con el nuevo CODEPAGE. Esto crea problemas cuando queremos encriptar un campo de una dbf, con las funciones de FW encript/decript o con otras propias como es mi caso.

Para solucionar este problema, Harbour cuenta con un parámetro extra al abrir una dbf:

DBUSEAREA ( lNuevaArea, cDriver, cNombre, cAlias, lCompartido, lSoloLectura, cCodePage)

En este último campo que oficialmente no viene documentado, es donde tenemos que indicar el codepage al abrir la dbf:

Por ejemplo DBUSEAREA (.t., , "prueba.dbf", "prueba", .t., .f., "ESWIN")

Para evitar problemas si luego cambiamos el CODEPAGE, yo abro las dbf donde tengo campos encriptado, con el CODEPAGE del lenguaje del ordenador, independientemente que luego seleccionemos otro idioma.

Re: Mapa caracteres Harbour

PostPosted: Sat Jun 28, 2014 10:23 pm
by cnavarro
Manuel Valdenebro wrote:Harbour, a diferencia de xHarbour, abre por defecto las dbf con el codepage cp437 (inglés). Si luego cambiamos el CODEPAGE a otro idioma, entonces graba la información en ese fichero con el nuevo CODEPAGE. Esto crea problemas cuando queremos encriptar un campo de una dbf, con las funciones de FW encript/decript o con otras propias como es mi caso.

Para solucionar este problema, Harbour cuenta con un parámetro extra al abrir una dbf:

DBUSEAREA ( lNuevaArea, cDriver, cNombre, cAlias, lCompartido, lSoloLectura, cCodePage)

En este último campo que oficialmente no viene documentado, es donde tenemos que indicar el codepage al abrir la dbf:

Por ejemplo DBUSEAREA (.t., , "prueba.dbf", "prueba", .t., .f., "ESWIN")

Para evitar problemas si luego cambiamos el CODEPAGE, yo abro las dbf donde tengo campos encriptado, con el CODEPAGE del lenguaje del ordenador, independientemente que luego seleccionemos otro idioma.


Gracias Manuel