Mapa caracteres Harbour

Post Reply
User avatar
Manuel Valdenebro
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Mapa caracteres Harbour

Post 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 _ 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 _ 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 _ son netamente del español, por ejemplo el segundo (¡) y el quinto que saca Harbour es la ñ (241).
Un saludo

Manuel
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Mapa caracteres Harbour

Post by Antonio Linares »

Manuel,

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

Antonio Linares
www.fivetechsoft.com
User avatar
Manuel Valdenebro
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Re: Mapa caracteres Harbour

Post 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?.
Un saludo

Manuel
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Mapa caracteres Harbour

Post 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")
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Manuel Valdenebro
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Re: Mapa caracteres Harbour

Post by Manuel Valdenebro »

Gracias Antonio. Voy a mirar en el foro de Harbour.
Un saludo

Manuel
User avatar
Manuel Valdenebro
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Re: Mapa caracteres Harbour

Post 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.
Un saludo

Manuel
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Mapa caracteres Harbour

Post by Antonio Linares »

Manuel,

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

Antonio Linares
www.fivetechsoft.com
User avatar
Manuel Valdenebro
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Re: Mapa caracteres Harbour

Post 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.
Un saludo

Manuel
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Mapa caracteres Harbour

Post 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
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
Post Reply