Page 1 of 1

Sustiturir vocales acentuadas SOLUCIONADO

Posted: Tue Oct 18, 2016 6:54 am
by pgfdz
Hola buenos días.

Estoy intentando hacer una función que sustituya las vocales acentuadas por sus correspondientes sin acentuar.
Es sencillo. Ahora lo que quiero es que además sea lo más rápido posible.

He probado varias formas.

1. Recorrer carácter por carácter. comprobar y sustitir. (lento)
2. Array con áéíóúÁÉÍÓÚ y 10 strtran de la cadena por aeiouAEIOU más rápido pero no suficiente

Me pregunto si alguien sabe traducir esto en expresiones regulares y si iría más rápido.

Un saludo

Re: Sustiturir vocales acentuadas

Posted: Tue Oct 18, 2016 12:00 pm
by jrestojeda
Hola,
Probá esto:

Code: Select all

Function ReemplazarVocales(cCadena)
Local cRespuesta

cRespuesta:=STRTRAN(cCadena   ,"á","a")
cRespuesta:=STRTRAN(cRespuesta,"é","e")
cRespuesta:=STRTRAN(cRespuesta,"í","i")
cRespuesta:=STRTRAN(cRespuesta,"ó","o")
cRespuesta:=STRTRAN(cRespuesta,"ú","u")

cRespuesta:=STRTRAN(cRespuesta,"Á","A")
cRespuesta:=STRTRAN(cRespuesta,"É","E")
cRespuesta:=STRTRAN(cRespuesta,"Í","I")
cRespuesta:=STRTRAN(cRespuesta,"Ó","O")
cRespuesta:=STRTRAN(cRespuesta,"Ú","U")

Return cRespuesta 
Otra usando Arrays:

Code: Select all

Function ReemplazarVocales2(cCadena)
Local cRespuesta,N,aArray1,aArray2

aArray1:={"á","é","í","ó","ú","Á","É","Í","Ó","Ú"}
aArray2:={"a","e","i","o","u","A","E","I","O","U"}

cRespuesta:=cCadena

FOR N=1 TO LEN(aArray1)
   cRespuesta:=STRTRAN(cRespuesta,aArray1[N],aArray2[N])
NEXT

Return cRespuesta
//
 
Espero te sirva.
Saludos,

Re: Sustiturir vocales acentuadas

Posted: Tue Oct 18, 2016 1:59 pm
by jbrita

Re: Sustiturir vocales acentuadas

Posted: Tue Oct 18, 2016 2:38 pm
by pgfdz
Hola, gracias por las respuestas.
Por mi parte utilicé un código que encontré en el foro y lo adapté: http://forums.fivetechsupport.com/viewt ... p?p=139845

Code: Select all

#pragma BEGINDUMP

#include <windows.h>
#include <hbapi.h>
#include <hbapiitm.h>
#include <hbapierr.h>

HB_FUNC( UNACC )
{
   char * cData     = hb_parc( 1 );
   HB_ISIZ      nLen      = hb_parclen( 1 );
   HB_ISIZ      nPos = 0, nPosRet = 0, nVal;

   char         cElem;

   if( ! cData )
   {
      hb_errRT_BASE( EG_ARG, 3012, NULL,
                     HB_ERR_FUNCNAME, 1, hb_paramError( 1 ) );
      return;
   }

   if( ! nLen )
   {
      hb_retc_null();
      return;
   }
   
   
   while( nPos < nLen )
   {
   
      cElem = cData[ nPos ];

      if( cElem == 'á' )
      {
         cData[ nPosRet ] = 'a';
      }
      else if( cElem == 'é' )
      {
         cData[ nPosRet ] = 'e';
      }
      else if( cElem == 'í' )
      {
         cData[ nPosRet ] = 'i';
      }
      else if( cElem == 'ó' )
      {
         cData[ nPosRet ] = 'o';
      }
      else if( cElem == 'ú' )
      {
         cData[ nPosRet ] = 'u';
      }
      if( cElem == 'Á' )
      {
         cData[ nPosRet ] = 'A';
      }
      else if( cElem == 'É' )
      {
         cData[ nPosRet ] = 'E';
      }
      else if( cElem == 'Í' )
      {
         cData[ nPosRet ] = 'I';
      }
      else if( cElem == 'Ó' )
      {
         cData[ nPosRet ] = 'O';
      }
      else if( cElem == 'Ú' )
      {
         cData[ nPosRet ] = 'U';
      }
   
      nPosRet++;
      nPos++;
   
   }
   hb_storc( cData, 1 );
}


#pragma ENDDUMP
 
Trabaja sobre el mismo buffer que se recibe.

Un saludo

Re: Sustiturir vocales acentuadas SOLUCIONADO

Posted: Wed Oct 19, 2016 8:12 am
by Carles
paco,

Quizas hb_translate() te sirva --> https://github.com/vszakats/harbour-cor ... n/lang.txt

Re: Sustiturir vocales acentuadas SOLUCIONADO

Posted: Wed Oct 19, 2016 11:58 am
by karinha
Carles wrote:paco,

Quizas hb_translate() te sirva --> https://github.com/vszakats/harbour-cor ... n/lang.txt
Carles, con harbour funciona perfecto. Con xHarbour no funciona?

Gracias, saludos.

Re: Sustiturir vocales acentuadas SOLUCIONADO

Posted: Wed Oct 19, 2016 12:02 pm
by Carles
Hola,
karinha wrote:
Carles wrote:paco,

Quizas hb_translate() te sirva --> https://github.com/vszakats/harbour-cor ... n/lang.txt
Carles, con harbour funciona perfecto. Con xHarbour no funciona?

Gracias, saludos.
Solo uso Harbour desde hace años, lo siento. :(