Hola Colegas !!
Estoy renegando hace unos días ... , buscando en el foro ... , pero no doy pie con bola, tengo muchas tablas con gran cantidad de registros en un sistema que estaba en HMG.3.0.46 y la codificación de la página de las tablas aparentemente es ESMWIN (español moderno), tengo que pasarlas a nuevas tablas con la codificación unicode UTF8, para que me traiga las eñes, los acentos, etc. y poder usarlas en un proyecto de HMG.3.5 UNICODE.
Probé varias opciones, pero no hay caso, no creo que sea tan difícil, solo que yo no me estoy dando cuenta, si alguien le paso y me puede tirar una idea se los agradezco. Saludos !
Pasar una tabla de ESMWIN a UTF8
Moderator: Rathinagiri
- mjaviergutierrez
- Posts: 164
- Joined: Fri Nov 30, 2012 7:51 pm
- DBs Used: DBF
- Location: San Lorenzo, Santa Fe, Argentina
- danielmaximiliano
- Posts: 2716
- Joined: Fri Apr 09, 2010 4:53 pm
- Location: Argentina
- Contact:
Re: Pasar una tabla de ESMWIN a UTF8
Gemini : Conversión de los archivos (.DBF o .PRG)
Si tus archivos fuente o tus tablas tienen datos en ANSI (Windows-1252), debes convertirlos a UTF-8.
Para el código fuente (.prg): Ábrelos con un editor como VS Code o Notepad++ y selecciona "Guardar como..." con codificación UTF-8 (sin BOM).
Para las tablas (.dbf): Necesitarás un script de transición.
2. Funciones de Conversión en Harbour
Harbour tiene funciones nativas para mover strings entre diferentes codificaciones. Las más importantes para tu caso son:
Función Propósito
HB_AnsiToUtf8( cString ) Convierte una cadena de ANSI (tu formato actual) a UTF-8.
HB_Utf8ToAnsi( cString ) El proceso inverso.
HB_CDPSELECT( "UTF8" ) Establece la página de códigos activa en el sistema.
3. Ejemplo de Script de Migración
Para pasar tus tablas viejas a las nuevas, lo ideal es crear un pequeño programa intermedio que haga el "puente":
4. Configuración en HMG 3.6 Unicode
Para que HMG reconozca que todo el entorno debe trabajar en Unicode, asegúrate de incluir esto en tu función Main:
SET CODEPAGE TO UNICODE: Esto le indica a HMG que los controles (TextBox, Grids, etc.) deben renderizar strings en UTF-8.
SET LANGUAGE TO SPANISH: Ajusta los mensajes internos del sistema.
[!IMPORTANT]
Cuidado con el tamaño de los campos: Recuerda que en UTF-8, caracteres como la ñ o las tildes pueden ocupar 2 bytes en lugar de 1. Si tienes un campo C(1) para un caracter especial, podrías necesitar ampliarlo a C(2) o más para evitar cortes de datos.
Si tus archivos fuente o tus tablas tienen datos en ANSI (Windows-1252), debes convertirlos a UTF-8.
Para el código fuente (.prg): Ábrelos con un editor como VS Code o Notepad++ y selecciona "Guardar como..." con codificación UTF-8 (sin BOM).
Para las tablas (.dbf): Necesitarás un script de transición.
2. Funciones de Conversión en Harbour
Harbour tiene funciones nativas para mover strings entre diferentes codificaciones. Las más importantes para tu caso son:
Función Propósito
HB_AnsiToUtf8( cString ) Convierte una cadena de ANSI (tu formato actual) a UTF-8.
HB_Utf8ToAnsi( cString ) El proceso inverso.
HB_CDPSELECT( "UTF8" ) Establece la página de códigos activa en el sistema.
3. Ejemplo de Script de Migración
Para pasar tus tablas viejas a las nuevas, lo ideal es crear un pequeño programa intermedio que haga el "puente":
Code: Select all
// Configuración inicial
REQUEST HB_CODEPAGE_ESWIN
REQUEST HB_CODEPAGE_UTF8
hb_cdpSelect( "ESWIN" ) // Primero leemos como español moderno
USE tabla_vieja.dbf SHARED NEW
COPY STRUCTURE TO tabla_nueva.dbf // La nueva estructura
USE tabla_nueva.dbf EXCLUSIVE NEW
SELECT tabla_vieja
DO WHILE !EOF()
SELECT tabla_nueva
APPEND BLANK
// Convertimos campo por campo (ejemplo con un campo 'Nombre')
REPLACE Nombre WITH HB_AnsiToUtf8( tabla_vieja->Nombre )
SELECT tabla_vieja
SKIP
ENDDOPara que HMG reconozca que todo el entorno debe trabajar en Unicode, asegúrate de incluir esto en tu función Main:
SET CODEPAGE TO UNICODE: Esto le indica a HMG que los controles (TextBox, Grids, etc.) deben renderizar strings en UTF-8.
SET LANGUAGE TO SPANISH: Ajusta los mensajes internos del sistema.
[!IMPORTANT]
Cuidado con el tamaño de los campos: Recuerda que en UTF-8, caracteres como la ñ o las tildes pueden ocupar 2 bytes en lugar de 1. Si tienes un campo C(1) para un caracter especial, podrías necesitar ampliarlo a C(2) o más para evitar cortes de datos.
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*
Saludos / Regards
DaNiElMaXiMiLiAnO
Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*
Saludos / Regards
DaNiElMaXiMiLiAnO
Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
- mjaviergutierrez
- Posts: 164
- Joined: Fri Nov 30, 2012 7:51 pm
- DBs Used: DBF
- Location: San Lorenzo, Santa Fe, Argentina
Re: Pasar una tabla de ESMWIN a UTF8
Hola Daniel, muchas gracias !
Muy clara tu explicación, yo siempre estuve enredado con ANSI, UNICODE, UTF8, etc etc
El programa para actualizar los datos de las tablas viejas a UTF8 , lo entendí perfecto pero no puedo resolver por que me dice que falta la función HB_AnsiIToUTF8( ) , le di vueltas por todo lados y no pude resolver. Compilando con HMG.3.5 como con HMG.3.6 , seguro me falta alguna actualización o librería ... y por ende, no me compila el proyecto.
Muy clara tu explicación, yo siempre estuve enredado con ANSI, UNICODE, UTF8, etc etc
El programa para actualizar los datos de las tablas viejas a UTF8 , lo entendí perfecto pero no puedo resolver por que me dice que falta la función HB_AnsiIToUTF8( ) , le di vueltas por todo lados y no pude resolver. Compilando con HMG.3.5 como con HMG.3.6 , seguro me falta alguna actualización o librería ... y por ende, no me compila el proyecto.
...
- danielmaximiliano
- Posts: 2716
- Joined: Fri Apr 09, 2010 4:53 pm
- Location: Argentina
- Contact:
Re: Pasar una tabla de ESMWIN a UTF8
prueba AnsiIToUTF8( )
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*
Saludos / Regards
DaNiElMaXiMiLiAnO
Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*
Saludos / Regards
DaNiElMaXiMiLiAnO
Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
- mjaviergutierrez
- Posts: 164
- Joined: Fri Nov 30, 2012 7:51 pm
- DBs Used: DBF
- Location: San Lorenzo, Santa Fe, Argentina
Re: Pasar una tabla de ESMWIN a UTF8
tampoco, si lo había probado sin el HB_, me olvide de comentar ...
...
- mjaviergutierrez
- Posts: 164
- Joined: Fri Nov 30, 2012 7:51 pm
- DBs Used: DBF
- Location: San Lorenzo, Santa Fe, Argentina
Re: Pasar una tabla de ESMWIN a UTF8
Bueno, pude pasar las viejas tablas en ESWIN a UTF8, reemplace AnsiToUTF8( ) , por HB_Translate y listo.
Dejo el código por si alguien le sirve.
Muchas Gracias DanielMaximiliano por tu ayuda.
Saludos.
SET CODEPAGE TO UNICODE
SET LANGUAGE TO SPANISH
REQUEST HB_CODEPAGE_ESWIN
REQUEST HB_CODEPAGE_UTF8
USE &cNombreAuxiliar New Exclusive Alias OldTable
USE &cNombreTabla New Exclusive Alias NewTable
While OldTable->( .not. EOF( ) )
NewTable->( dbAppend( ) )
For i:=1 To OldTable->( FCount( ) )
If ValType( OldTable->( FieldGet( i ) ) )=="C"
NewTable->( FieldPut( i, HB_Translate( OldTable->( FieldGet( i ) ),'ESWIN' ,'UTF8' ) ) )
Else
NewTable->( FieldPut( i, OldTable->( FieldGet( i ) ) ) )
EndIf
Next i
OldTable->( dbskip( ) )
End While
OldTable->( dbCloseArea( ) )
NewTable->( dbCloseArea( ) )
Dejo el código por si alguien le sirve.
Muchas Gracias DanielMaximiliano por tu ayuda.
Saludos.
SET CODEPAGE TO UNICODE
SET LANGUAGE TO SPANISH
REQUEST HB_CODEPAGE_ESWIN
REQUEST HB_CODEPAGE_UTF8
USE &cNombreAuxiliar New Exclusive Alias OldTable
USE &cNombreTabla New Exclusive Alias NewTable
While OldTable->( .not. EOF( ) )
NewTable->( dbAppend( ) )
For i:=1 To OldTable->( FCount( ) )
If ValType( OldTable->( FieldGet( i ) ) )=="C"
NewTable->( FieldPut( i, HB_Translate( OldTable->( FieldGet( i ) ),'ESWIN' ,'UTF8' ) ) )
Else
NewTable->( FieldPut( i, OldTable->( FieldGet( i ) ) ) )
EndIf
Next i
OldTable->( dbskip( ) )
End While
OldTable->( dbCloseArea( ) )
NewTable->( dbCloseArea( ) )
...
- danielmaximiliano
- Posts: 2716
- Joined: Fri Apr 09, 2010 4:53 pm
- Location: Argentina
- Contact:
Re: Pasar una tabla de ESMWIN a UTF8
un Placer Ayudarte Javier
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*
Saludos / Regards
DaNiElMaXiMiLiAnO
Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*
Saludos / Regards
DaNiElMaXiMiLiAnO
Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO