Page 1 of 1

Pasar una tabla de ESMWIN a UTF8

Posted: Sat Apr 25, 2026 9:27 pm
by mjaviergutierrez
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 !

Re: Pasar una tabla de ESMWIN a UTF8

Posted: Sun Apr 26, 2026 12:08 am
by danielmaximiliano
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":

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
ENDDO
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.

Re: Pasar una tabla de ESMWIN a UTF8

Posted: Tue Apr 28, 2026 11:25 pm
by mjaviergutierrez
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.

Re: Pasar una tabla de ESMWIN a UTF8

Posted: Wed Apr 29, 2026 2:09 am
by danielmaximiliano
prueba AnsiIToUTF8( )

Re: Pasar una tabla de ESMWIN a UTF8

Posted: Wed Apr 29, 2026 12:40 pm
by mjaviergutierrez
tampoco, si lo había probado sin el HB_, me olvide de comentar ...

Re: Pasar una tabla de ESMWIN a UTF8

Posted: Wed Apr 29, 2026 4:27 pm
by mjaviergutierrez
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( ) )

Re: Pasar una tabla de ESMWIN a UTF8

Posted: Wed Apr 29, 2026 5:35 pm
by danielmaximiliano
un Placer Ayudarte Javier