Função para fonetizar textos em c# 5


Fonetizar significa examinar a palavra sob o ponto de vista fonético. Analisar as partes da palavra pelo seu som e não pela escrita. Por exemplo: O nome Felipe pode ter várias variações como Filipe, Filipi, Filipe, Philipe, Phelipe, Phelipi.  Ao fonetizar esses nomes, chegamos sempre no mesmo resultado (FILIPI).

 

C-sharp

A fonetização é muito útil para a utilização de buscas aproximadas. No exemplo acima, ao buscarmos o nome Felipe, poderíamos ter como retorno resultados contendo todos as outras variações do nome Felipe.

Para testar, você poderá baixar a classe de fonetização reescrita por mim em c# e utiliza-la em seu projeto .net. Para utilizar-la  basta chamar o método estático Fonetiza da classe Fonetico do Namespace Util.

Ex.:

Response.Write(Util.Fonetico.Fonetiza("Felipe"));

download

/// 29 de Setembro de 2008
/// http://www.marvinsiq.com
/// Marcus Vinícius Siqueira
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace Util
{
    ///
    /// Classe Fonetico
    ///
    /// Marcus Vinícius Siqueira
    /// O código original desta classe foi traduzido da linguagem Java.
    public class Fonetico
    {
        ///
        /// Fonetiza a string recebida como parametro
        ///
        ///Retorna o texto fonetizado
        ///
        public static string Fonetiza(string str)
        {
            str = str.ToUpper(); //todas as letras maiusculas
            str = RemovePrep(str); //remove as preposições
            str = RemoveAcentos(str); //remove os acentos
            str = RemoveCaracteresEspeciais(str); //remove caracteres diferentes de A-Z, 0-9
            str = FonetizaTexto(str); //fonetiza o texto
            return str;
        }
        ///
        /// Remove as preposições
        ///
        ///
        ///
        public static String RemovePrep(String str)
        {
            String[] prep = new String[18];
            int i = 0;
            prep[i++] = "DEL";
            prep[i++] = "DA";
            prep[i++] = "DE";
            prep[i++] = "DI";
            prep[i++] = "DO";
            prep[i++] = "DU";
            prep[i++] = "DAS";
            prep[i++] = "DOS";
            prep[i++] = "DEU";
            prep[i++] = "DER";
            prep[i++] = "E";
            prep[i++] = "LA";
            prep[i++] = "LE";
            prep[i++] = "LES";
            prep[i++] = "LOS";
            prep[i++] = "VAN";
            prep[i++] = "VON";
            prep[i++] = "EL";
            string[] cpalavra = str.Split(' ');
            ArrayList palavra = StringArrayToArrayList(cpalavra);
            for (i = 0; i < palavra.Count; i++)
            {
                for (int j = 0; j < prep.Length; j++)
                {
                    if (palavra[i].ToString().CompareTo(prep[j]) == 0)
                    {
                        palavra.RemoveAt(i);
                        i--;
                    }
                }
            }
            return ArrayListToStr(palavra);
        }
        ///
        /// Remove os acentos
        ///
        ///
        ///
        public static String RemoveAcentos(String str)
        {
            str = str.Replace('É', 'E');
            str = str.Replace('Ê', 'E');
            str = str.Replace('Ë', 'E');
            str = str.Replace('É', 'E');
            str = str.Replace('Á', 'A');
            str = str.Replace('À', 'A');
            str = str.Replace('Â', 'A');
            str = str.Replace('Ã', 'A');
            str = str.Replace('Ä', 'A');
            str = str.Replace('Ç', 'C');
            str = str.Replace('Í', 'I');
            str = str.Replace('Ó', 'O');
            str = str.Replace('Ó', 'O');
            str = str.Replace('Õ', 'O');
            str = str.Replace('Ô', 'O');
            str = str.Replace('Ú', 'U');
            str = str.Replace('Ü', 'U');
            str = str.Replace('Ñ', 'N');
            return str;
        }
        ///
        /// Remove os caracteres especiais
        ///
        ///
        ///
        public static String RemoveCaracteresEspeciais(String str)
        {
            string retorno = "";
            for (int i = 0; i < str.Length; i++)
            {
                char caracter = char.Parse(str.Substring(i, 1));
                int ascii = Convert.ToInt32(caracter);
                if (
                    (ascii >= 48 && ascii <= 57) ||
                    (ascii >= 65 && ascii <= 90) ||
                    (ascii >= 97 && ascii <= 122) ||
                    (caracter == '&') ||
                    (caracter == '_') ||
                    (caracter == ' ')
                    )
                {
                    retorno = retorno + caracter;
                }
            }
            return retorno;
        }
        private static String FonetizaTexto(String str)
        {
            //Função que faz efetivamente a substituição de letras,
            //fonetizando o texto
            //matrizes de caracteres utilizadas para manipular o texto
            char[] foncmp = new char[256];
            char[] fonwrk = new char[256];
            char[] fonaux = new char[256];
            char[] fonfon = new char[256];
            int x, k, //contadores
            desloc, //posicao atual no vetor
            endfon, //indica se eh ultimo fonema
            copfon, //indica se o fonema deve ser copiado
            copmud, newmud; //indica se o fonema eh mudo
            //Vetor utilizado para armazenar o texto:
            //cada palavra do texto e armazenada em uma posicao do vetor
            string[] ccomponent;
            ArrayList component = new ArrayList();
            int i = 0;
            int j = 0;
            str = RemoveCaracteresMultiplos(str);
            //todos os caracteres duplicados sao eliminados
            //exemplo: SS -> S, RR -> R
            ccomponent = str.Split(' ');
            for (i = 0; i < ccomponent.Length; i++)
            {
                component.Add(ccomponent[i]);
            }
            //o texto eh armazenado no vetor:
            //cada palavra ocupa uma posicao do vetor
            for (desloc = 0; desloc < component.Count; desloc++)
            {
                //percorre o vetor, palavra a palavra
                for (i = 0; i < 256; i++)
                {
                    fonwrk[i] = ' ';
                    fonfon[i] = ' ';//branqueia as matrizes
                }
                foncmp = component[desloc].ToString().ToCharArray();
                fonaux = foncmp;
                j = 0;
                if (component[desloc].ToString().Length == 1)
                {
                    // se a palavra possuir apenas 1 caracter, nao altera
                    fonwrk[0] = foncmp[0];
                    // se o caracter for "_", troca por espaco em branco
                    if (foncmp[0] == '_')
                    {
                        fonwrk[0] = ' ';
                    }
                    // se o caracter for "E", "&" ou "I", troca por "i"
                    else if ((foncmp[0] == 'E') || (foncmp[0] == '&') || (foncmp[0] == 'I'))
                    {
                        fonwrk[0] = 'i';
                    }
                }
                // Mais de um caracter
                else
                {
                    for (i = 0; i < component[desloc].ToString().Length; i++)
                    {
                        if (foncmp[i] == '_')
                            fonfon[i] = 'Y'; // _ -> Y
                        //& -> i
                        else if (foncmp[i] == '&')
                            fonfon[i] = 'i';
                        else if ((foncmp[i] == 'E') || (foncmp[i] == 'Y') || (foncmp[i] == 'I'))
                            fonfon[i] = 'i';     // E, Y, I -> i
                        else if ((foncmp[i] == 'O') || (foncmp[i] == 'U'))
                            fonfon[i] = 'o';     // O, U -> u
                        else if (foncmp[i] == 'A')
                            fonfon[i] = 'a';      // A -> a
                        else if (foncmp[i] == 'S')
                            fonfon[i] = 's';     // S -> s
                        else
                            fonfon[i] = foncmp[i];
                    }
                    //caracter nao eh modificado
                    endfon = 0;
                    fonaux = fonfon;
                    // palavras formadas por apenas 3 consoantes sao dispensadas do processo de fonetizacao
                    if (fonaux[3] == ' ')
                    {
                        if ((fonaux[0] == 'a') || (fonaux[0] == 'i') || (fonaux[0] == 'o'))
                            endfon = 0;
                        else if ((fonaux[1] == 'a') || (fonaux[1] == 'i') || (fonaux[1] == 'o'))
                            endfon = 0;
                        else if ((fonaux[2] == 'a') || (fonaux[2] == 'i') || (fonaux[2] == 'o'))
                            endfon = 0;
                        else
                        {
                            endfon = 1;
                            fonwrk[0] = fonaux[0];
                            fonwrk[1] = fonaux[1];
                            fonwrk[2] = fonaux[2];
                        }
                    }
                    //se a palavra nao for formada por apenas 3 consoantes...
                    if (endfon != 1)
                    {
                        for (i = 0; i < component[desloc].ToString().Length; i++)
                        {
                            //percorre a palavra corrente, letra a letra
                            copfon = 0;
                            copmud = 0;
                            newmud = 0;
                            //zera variaveis de controle
                            switch (fonaux[i])
                            {
                                #region A
                                case 'a':  //se o caracter for a
                                    //se a palavra termina com As, AZ, AM, ou AN,
                                    //elimina a consoante do final da palavra
                                    if ((fonaux[i + 1] == 's') || (fonaux[i + 1] == 'Z') || (fonaux[i + 1] == 'M') || (fonaux[i + 1] == 'N'))
                                        if (fonaux[i + 2] != ' ')
                                            copfon = 1;
                                        else
                                        {
                                            fonwrk[j] = 'a';
                                            fonwrk[j + 1] = ' ';
                                            j++;
                                            i++;
                                        }
                                    else copfon = 1;
                                    break;
                                #endregion
                                #region B
                                case 'B':  //se o caracter for B
                                    // B nao eh modificado
                                    copmud = 1;
                                    break;
                                #endregion
                                #region C
                                case 'C':  //se o caracter for C
                                    x = 0;
                                    if (fonaux[i + 1] == 'i')
                                    //ci vira si
                                    {
                                        fonwrk[j] = 's';
                                        j++;
                                        break;
                                    }
                                    //coes final vira cao
                                    if ((fonaux[i + 1] == 'o') && (fonaux[i + 2] == 'i') && (fonaux[i + 3] == 's') && (fonaux[i + 4] == ' '))
                                    {
                                        fonwrk[j] = 'K';
                                        fonwrk[j + 1] = 'a';
                                        fonwrk[j + 2] = 'o';
                                        i = i + 4;
                                        break;
                                    }
                                    //ct vira t
                                    if (fonaux[i + 1] == 'T')
                                        break;
                                    // c vira k
                                    if (fonaux[i + 1] != 'H')
                                    {
                                        fonwrk[j] = 'K';
                                        newmud = 1;
                                        //   ck vira k
                                        if (fonaux[i + 1] == 'K')
                                        {
                                            i++;
                                            break;
                                        }
                                        else break;
                                    }
                                    //ch vira k para chi final, chi vogal, chini final e
                                    //chiti final
                                    //chi final ou chi vogal
                                    if (fonaux[i + 1] == 'H')
                                        if (fonaux[i + 2] == 'i')
                                            if ((fonaux[i + 3] == 'a') || (fonaux[i + 3] == 'i') || (fonaux[i + 3] == 'o'))
                                                x = 1;
                                            // chini final
                                            else if (fonaux[i + 3] == 'N')
                                                if (fonaux[i + 4] == 'i')
                                                    if (fonaux[i + 5] == ' ')
                                                        x = 1;
                                                    else { }
                                                else { }
                                            else
                                                // chiti final
                                                if (fonaux[i + 3] == 'T')
                                                    if (fonaux[i + 4] == 'i')
                                                        if (fonaux[i + 5] == ' ')
                                                            x = 1;
                                    if (x == 1)
                                    {
                                        fonwrk[j] = 'K';
                                        j++;
                                        i++;
                                        break;
                                    }
                                    //chi, nao chi final, chi vogal, chini final ou chiti final
                                    //ch nao seguido de i
                                    //se anterior nao e s, ch = x
                                    if (j > 0)
                                        //sch: fonema recua uma posicao
                                        if (fonwrk[j - 1] == 's')
                                        {
                                            j--;
                                        }
                                    fonwrk[j] = 'X';
                                    newmud = 1;
                                    i++;
                                    break;
                                #endregion
                                #region D
                                case 'D':  //se o caracter for D
                                    x = 0;
                                    //procura por dor
                                    if (fonaux[i + 1] != 'o')
                                    {
                                        copmud = 1;
                                        break;
                                    }
                                    else
                                        if (fonaux[i + 2] == 'R')
                                            if (i != 0)
                                                x = 1; // dor nao inicial
                                            else copfon = 1; // dor inicial
                                        else copfon = 1;  // nao e dor
                                    if (x == 1)
                                        if (fonaux[i + 3] == 'i')
                                            if (fonaux[i + 4] == 's') // dores
                                                if (fonaux[i + 5] != ' ')
                                                    x = 0;  // nao e dores
                                                else { }
                                            else x = 0;
                                        else
                                            if (fonaux[i + 3] == 'a')
                                                if (fonaux[i + 4] != ' ')
                                                    if (fonaux[i + 4] != 's')
                                                        x = 0;
                                                    else
                                                        if (fonaux[i + 5] != ' ')
                                                            x = 0;
                                                        else { }
                                                else { }
                                            else x = 0;
                                    else x = 0;
                                    if (x == 1)
                                    {
                                        fonwrk[j] = 'D';
                                        fonwrk[j + 1] = 'o';
                                        fonwrk[j + 2] = 'R';
                                        i = i + 5;
                                    }
                                    else copfon = 1;
                                    break;
                                #endregion
                                #region F
                                case 'F':  //se o caracter for F
                                    //F nao eh modificado
                                    copmud = 1;
                                    break;
                                #endregion
                                #region G
                                case 'G':  //se o caracter for G
                                    //gui -> gi
                                    if (fonaux[i + 1] == 'o')
                                    {
                                        if (fonaux[i + 2] == 'i')
                                        {
                                            fonwrk[j] = 'G';
                                            fonwrk[j + 1] = 'i';
                                            j += 2;
                                            i += 2;
                                        }
                                        //diferente de gui copia como consoante muda
                                        else copmud = 1;
                                    }
                                    else
                                        //gl
                                        if (fonaux[i + 1] == 'L')
                                            if (fonaux[i + 2] == 'i')
                                                //gli + vogal -> li + vogal
                                                if ((fonaux[i + 3] == 'a') ||
                                                    (fonaux[i + 3] == 'i') ||
                                                    (fonaux[i + 3] == 'o'))
                                                {
                                                    fonwrk[j] = fonaux[i + 1];
                                                    fonwrk[j + 1] = fonaux[i + 2];
                                                    j += 2;
                                                    i += 2;
                                                }
                                                else
                                                    //glin -> lin
                                                    if (fonaux[i + 3] == 'N')
                                                    {
                                                        fonwrk[j] = fonaux[i + 1];
                                                        fonwrk[j + 1] = fonaux[i + 2];
                                                        j += 2;
                                                        i += 2;
                                                    }/*if*/
                                                    else copmud = 1;
                                            else copmud = 1;
                                        else
                                            //gn + vogal -> ni + vogal
                                            if (fonaux[i + 1] == 'N')
                                                if ((fonaux[i + 2] != 'a') &&
                                                   (fonaux[i + 2] != 'i') &&
                                                   (fonaux[i + 2] != 'o'))
                                                    copmud = 1;
                                                else
                                                {
                                                    fonwrk[j] = 'N';
                                                    fonwrk[j + 1] = 'i';
                                                    j += 2;
                                                    i++;
                                                }
                                            else
                                                //   ghi -> gi
                                                if (fonaux[i + 1] == 'H')
                                                    if (fonaux[i + 2] == 'i')
                                                    {
                                                        fonwrk[j] = 'G';
                                                        fonwrk[j + 1] = 'i';
                                                        j += 2;
                                                        i += 2;
                                                    }
                                                    else copmud = 1;
                                                else copmud = 1;
                                    break;
                                #endregion
                                #region H
                                case 'H':  //se o caracter for H
                                    //H eh desconsiderado
                                    break;
                                #endregion
                                #region I
                                case 'i':  //se o caracter for i
                                    if (fonaux[i + 2] == ' ')
                                        //is ou iz final perde a consoante
                                        if (fonaux[i + 1] == 's')
                                        {
                                            fonwrk[j] = 'i';
                                            break;
                                        }
                                        else
                                            if (fonaux[i + 1] == 'Z')
                                            {
                                                fonwrk[j] = 'i';
                                                break;
                                            }
                                    //ix
                                    if (fonaux[i + 1] != 'X')
                                        copfon = 1;
                                    else
                                        if (i != 0)
                                            copfon = 1;
                                        else
                                            //ix vogal no inicio torna-se iz
                                            if ((fonaux[i + 2] == 'a') ||
                                                (fonaux[i + 2] == 'i') ||
                                                (fonaux[i + 2] == 'o'))
                                            {
                                                fonwrk[j] = 'i';
                                                fonwrk[j + 1] = 'Z';
                                                j += 2;
                                                i++;
                                                break;
                                            }
                                            else
                                                //ix consoante no inicio torna-se is
                                                if (fonaux[i + 2] == 'C' || fonaux[i + 2] == 's')
                                                {
                                                    fonwrk[j] = 'i';
                                                    j++;
                                                    i++;
                                                    break;
                                                }
                                                else
                                                {
                                                    fonwrk[j] = 'i';
                                                    fonwrk[j + 1] = 's';
                                                    j += 2;
                                                    i++;
                                                    break;
                                                }
                                    break;
                                #endregion
                                #region J
                                case 'J':  //se o caracter for J
                                    //J -> Gi
                                    fonwrk[j] = 'G';
                                    fonwrk[j + 1] = 'i';
                                    j += 2;
                                    break;
                                #endregion
                                #region K
                                case 'K':  //se o caracter for K
                                    //KT -> T
                                    if (fonaux[i + 1] != 'T')
                                        copmud = 1;
                                    break;
                                #endregion
                                #region L
                                case 'L':  //se o caracter for L
                                    //L + vogal nao eh modificado
                                    if ((fonaux[i + 1] == 'a') ||
                                     (fonaux[i + 1] == 'i') ||
                                     (fonaux[i + 1] == 'o'))
                                        copfon = 1;
                                    else
                                        //L + consoante -> U + consoante
                                        if (fonaux[i + 1] != 'H')
                                        {
                                            fonwrk[j] = 'o';
                                            j++;
                                            break;
                                        }
                                         //LH + consoante nao eh modificado
                                        else
                                            if (fonaux[i + 2] != 'a' &&
                                                fonaux[i + 2] != 'i' &&
                                                fonaux[i + 2] != 'o')
                                                copfon = 1;
                                            else
                                            //LH + vogal -> LI + vogal
                                            {
                                                fonwrk[j] = 'L';
                                                fonwrk[j + 1] = 'i';
                                                j += 2;
                                                i++;
                                                break;
                                            }
                                    break;
                                #endregion
                                #region M
                                case 'M':  //se o caracter for M
                                    //M + consoante -> N + consoante
                                    //M final -> N
                                    if ((fonaux[i + 1] != 'a' &&
                                      fonaux[i + 1] != 'i' &&
                                      fonaux[i + 1] != 'o') ||
                                     (fonaux[i + 1] == ' '))
                                    {
                                        fonwrk[j] = 'N';
                                        j++;
                                    }
                                    //M nao eh alterado
                                    else copfon = 1;
                                    break;
                                #endregion
                                #region N
                                case 'N':  //se o caracter for N
                                    //NGT -> NT
                                    if ((fonaux[i + 1] == 'G') &&
                                     (fonaux[i + 2] == 'T'))
                                    {
                                        fonaux[i + 1] = 'N';
                                        copfon = 1;
                                    }
                                    else
                                        //NH + consoante nao eh modificado
                                        if (fonaux[i + 1] == 'H')
                                            if ((fonaux[i + 2] != 'a') &&
                                                (fonaux[i + 2] != 'i') &&
                                                (fonaux[i + 2] != 'o'))
                                                copfon = 1;
                                             //NH + vogal -> Ni + vogal
                                            else
                                            {
                                                fonwrk[j] = 'N';
                                                fonwrk[j + 1] = 'i';
                                                j += 2;
                                                i++;
                                            }
                                        else copfon = 1;
                                    break;
                                #endregion
                                #region O
                                case 'o':  //se o caracter for o
                                    //oS final -> o
                                    //oZ final -> o
                                    if ((fonaux[i + 1] == 's') ||
                                     (fonaux[i + 1] == 'Z'))
                                        if (fonaux[i + 2] == ' ')
                                        {
                                            fonwrk[j] = 'o';
                                            break;
                                        }
                                        else copfon = 1;
                                    else copfon = 1;
                                    break;
                                    #endregion
                                #region P
                                case 'P':  //se o caracter for P
                                    //PH -> F
                                    if (fonaux[i + 1] == 'H')
                                    {
                                        fonwrk[j] = 'F';
                                        i++;
                                        newmud = 1;
                                    }
                                    else
                                        copmud = 1;
                                    break;
                                #endregion
                                #region Q
                                case 'Q':  //se o caracter for Q
                                    //Koi -> Ki (QUE, QUI -> KE, KI)
                                    if (fonaux[i + 1] == 'o')
                                        if (fonaux[i + 2] == 'i')
                                        {
                                            fonwrk[j] = 'K';
                                            j++;
                                            i++;
                                            break;
                                        }
                                    //QoA -> KoA (QUA -> KUA)
                                    fonwrk[j] = 'K';
                                    j++;
                                    break;
                                #endregion
                                #region R
                                case 'R':  //se o caracter for R
                                    //R nao eh modificado
                                    copfon = 1;
                                    break;
                                #endregion
                                #region S
                                case 's':  //se o caracter for s
                                    //s final eh ignorado
                                    if (fonaux[i + 1] == ' ')
                                        break;
                                    //s inicial + vogal nao eh modificado
                                    if ((fonaux[i + 1] == 'a') ||
                                     (fonaux[i + 1] == 'i') ||
                                     (fonaux[i + 1] == 'o'))
                                        if (i == 0)
                                        {
                                            copfon = 1;
                                            break;
                                        }
                                        else
                                            //s entre duas vogais -> z
                                            if ((fonaux[i - 1] != 'a') &&
                                                (fonaux[i - 1] != 'i') &&
                                                (fonaux[i - 1] != 'o'))
                                            {
                                                copfon = 1;
                                                break;
                                            }
                                            else
                                                //SoL nao eh modificado
                                                if ((fonaux[i + 1] == 'o') &&
                                                    (fonaux[i + 2] == 'L') &&
                                                    (fonaux[i + 3] == ' '))
                                                {
                                                    copfon = 1;
                                                    break;
                                                }
                                                else
                                                {
                                                    fonwrk[j] = 'Z';
                                                    j++;
                                                    break;
                                                }
                                    //ss -> s
                                    if (fonaux[i + 1] == 's')
                                        if (fonaux[i + 2] != ' ')
                                        {
                                            copfon = 1;
                                            i++;
                                            break;
                                        }
                                        else
                                        {
                                            fonaux[i + 1] = ' ';
                                            break;
                                        }
                                    //s inicial seguido de consoante fica precedido de i
                                    //se nao for sci, sh ou sch nao seguido de vogal
                                    if (i == 0)
                                        if (!((fonaux[i + 1] == 'C') &&
                                            (fonaux[i + 2] == 'i')))
                                            if (fonaux[i + 1] != 'H')
                                                if (!((fonaux[i + 1] == 'C') &&
                                                     (fonaux[i + 2] == 'H') &&
                                                     ((fonaux[i + 3] != 'a') &&
                                                      (fonaux[i + 3] != 'i') &&
                                                      (fonaux[i + 3] != 'o'))))
                                                {
                                                    fonwrk[j] = 'i';
                                                    j++;
                                                    copfon = 1;
                                                    break;
                                                }
                                    //sH -> X;
                                    if (fonaux[i + 1] == 'H')
                                    {
                                        fonwrk[j] = 'X';
                                        i++;
                                        newmud = 1;
                                        break;
                                    }
                                    if (fonaux[i + 1] != 'C')
                                    {
                                        copfon = 1;
                                        break;
                                    }
                                    //   sCh nao seguido de i torna-se X
                                    if (fonaux[i + 2] == 'H')
                                    {
                                        fonwrk[j] = 'X';
                                        i += 2;
                                        newmud = 1;
                                        break;
                                    }
                                    if (fonaux[i + 2] != 'i')
                                    {
                                        copfon = 1;
                                        break;
                                    }
                                    //sCi final -> Xi
                                    if (fonaux[i + 3] == ' ')
                                    {
                                        fonwrk[j] = 'X';
                                        fonwrk[j + 1] = 'i';
                                        i = i + 3;
                                        break;
                                    }
                                    //sCi vogal -> X
                                    if ((fonaux[i + 3] == 'a') ||
                                     (fonaux[i + 3] == 'i') ||
                                     (fonaux[i + 3] == 'o'))
                                    {
                                        fonwrk[j] = 'X';
                                        j++;
                                        i += 2;
                                        break;
                                    }
                                    //sCi consoante -> si
                                    fonwrk[j] = 's';
                                    fonwrk[j + 1] = 'i';
                                    j += 2;
                                    i += 2;
                                    break;
                                #endregion
                                #region T
                                case 'T':  //se o caracter for T
                                    //TS -> S
                                    if (fonaux[i + 1] == 's')
                                        break;
                                        //TZ -> Z
                                    else
                                        if (fonaux[i + 1] == 'Z')
                                            break;
                                        else copmud = 1;
                                    break;
                                #endregion
                                #region V
                                case 'V':  //se o caracter for V
                                #endregion
                                #region W
                                case 'W':  //ou se o caracter for W
                                    //V,W inicial + vogal -> o + vogal (U + vogal)
                                    if (fonaux[i + 1] == 'a' ||
                                     fonaux[i + 1] == 'i' ||
                                     fonaux[i + 1] == 'o')
                                        if (i == 0)
                                        {
                                            fonwrk[j] = 'o';
                                            j++;
                                        }
                                           //V,W NAO inicial + vogal -> V + vogal
                                        else
                                        {
                                            fonwrk[j] = 'V';
                                            newmud = 1;
                                        }
                                    else
                                    {
                                        fonwrk[j] = 'V';
                                        newmud = 1;
                                    }
                                    break;
                                #endregion
                                #region X
                                case 'X':  //se o caracter for X
                                    //caracter nao eh modificado
                                    copmud = 1;
                                    break;
                                #endregion
                                #region Y
                                case 'Y':  //se o caracter for Y
                                    //Y jah foi tratado acima
                                    break;
                                #endregion
                                #region Z
                                case 'Z':  //se o caracter for Z
                                    //Z final eh eliminado
                                    if (fonaux[i + 1] == ' ')
                                        break;
                                        //Z + vogal nao eh modificado
                                    else
                                        if ((fonaux[i + 1] == 'a') ||
                                           (fonaux[i + 1] == 'i') ||
                                           (fonaux[i + 1] == 'o'))
                                            copfon = 1;
                                           //Z + consoante -> S + consoante
                                        else
                                        {
                                            fonwrk[j] = 's';
                                            j++;
                                        }
                                    break;
                                #endregion
                                default: //se o caracter nao for um dos jah relacionados
                                    //o caracter nao eh modificado
                                    fonwrk[j] = fonaux[i];
                                    j++;
                                    break;
                            }//switch
                            //copia caracter corrente
                            if (copfon == 1)
                            {
                                fonwrk[j] = fonaux[i];
                                j++;
                            }
                            //insercao de i apos consoante muda
                            if (copmud == 1)
                                fonwrk[j] = fonaux[i];
                            if (copmud == 1 || newmud == 1)
                            {
                                j++;
                                k = 0;
                                while (k == 0)
                                    if (fonaux[i + 1] == ' ')
                                    //e final mudo
                                    {
                                        fonwrk[j] = 'i';
                                        k = 1;
                                    }
                                    else
                                        if ((fonaux[i + 1] == 'a') ||
                                           (fonaux[i + 1] == 'i') ||
                                           (fonaux[i + 1] == 'o'))
                                            k = 1;
                                        else
                                            if (fonwrk[j - 1] == 'X')
                                            {
                                                fonwrk[j] = 'i';
                                                j++;
                                                k = 1;
                                            }
                                            else
                                                if (fonaux[i + 1] == 'R')
                                                    k = 1;
                                                else
                                                    if (fonaux[i + 1] == 'L')
                                                        k = 1;
                                                    else
                                                        if (fonaux[i + 1] != 'H')
                                                        {
                                                            fonwrk[j] = 'i';
                                                            j++;
                                                            k = 1;
                                                        }
                                                        else i++;
                            }
                        }//for
                    }
                }
                for (i = 0; i < component[desloc].ToString().Length + 3; i++)
                    //percorre toda a palavra, letra a letra
                    //i -> I
                    if (fonwrk[i] == 'i')
                        fonwrk[i] = 'I';
                    else
                        //a -> A
                        if (fonwrk[i] == 'a')
                            fonwrk[i] = 'A';
                        else
                            //o -> U
                            if (fonwrk[i] == 'o')
                                fonwrk[i] = 'U';
                            else
                                //s -> S
                                if (fonwrk[i] == 's')
                                    fonwrk[i] = 'S';
                                else
                                    //E -> b
                                    if (fonwrk[i] == 'E')
                                        fonwrk[i] = ' ';
                                    else
                                        //Y -> _
                                        if (fonwrk[i] == 'Y')
                                            fonwrk[i] = '_';
                    //retorna a palavra, modificada, ao vetor que contem o texto
                    string strfonwrk = "";
                    int l = 0;
                    while (fonwrk[l] != ' ')
                    {
                        strfonwrk = strfonwrk + fonwrk[l];
                        l++;
                    }
                    component[desloc] = strfonwrk;
                    j = 0; //zera o contador
                }//for
            str = ArrayListToStr(component);
            //remonta as palavras armazenadas no vetor em um unico string
            str = RemoveCaracteresMultiplos(str);
            //remove os caracteres duplicados
            return str.ToUpper().Trim();
        }
        ///
        /// Remove os carateres que estao multiplicados. Ex.:ss, rr
        ///
        ///
        ///
        private static String RemoveCaracteresMultiplos(String str)
        {
            String foncmp = "";
            //matriz de caracteres que armazena o texto sem duplicatas
            char[] fonaux = new char[256];
            //matriz de caracteres que armazena o texto original
            char[] tip = new char[1]; //armazena o caracter anterior
            tip[0] = ' ';
            fonaux = str.ToCharArray();
            for (int i = 0; i < str.Length; i++)
            {
                //percorre o texto, caracter a caracter.
                //elimina o caracter se ele for duplicata e se nao for numero, espaco ou S
                if ((fonaux[i] != tip[0]) || (fonaux[i] == ' ')
                || ((fonaux[i] >= '0') && (fonaux[i] <= '9'))
                || ((fonaux[i] == 'S') && (fonaux[i - 1] == 'S') &&
                ((i > 1) && (fonaux[i - 2] != 'S'))))
                {
                    foncmp += fonaux[i];
                }
                tip[0] = fonaux[i];
                //reajusta o caracter de comparacao
            }
            return foncmp.Trim();
        }
        ///
        /// Converte um vetor de strings em um ArrayList
        ///
        ///
        ///
        public static ArrayList StringArrayToArrayList(string[] str)
        {
            ArrayList array = new ArrayList();
            for (int i = 0; i < str.Length; i++)
            {
                array.Add(str[i]);
            }
            return array;
        }
        ///
        /// Converte o texto em um ArrayList onde cada palavra do texto ocupa uma posicao do Array
        ///
        ///
        ///
        public static ArrayList strToArrayList(String str)
        {
            str = str.Trim();
            char[] fonaux = new char[256];
            char[] foncmp = new char[256];
            ArrayList component = new ArrayList();
            int first = 1; //posicao da matriz
            int pos = 0; //indica se eh espaco em branco repetido
            int rep = 0; //indica se eh o primeiro caracter
            fonaux = str.ToCharArray();
            for (int j = 0; j < 256; j++)
                foncmp[j] = ' ';
            for (int i = 0; i < str.Length; i++)
            {
                //percorre o texto, caracter a caracter
                //se encontrar um espaco e nao for o primeiro caracter,
                //armazena a palavra no vetor
                if ((fonaux[i] == ' ') && (first != 1))
                {
                    if (rep == 0)
                    {
                        component.Add(foncmp.ToString().Trim());
                        pos = 0;
                        rep = 1;
                        for (int j = 0; j < 256; j++)
                            foncmp[j] = ' ';
                    }
                }
                else
                {
                    foncmp[pos] = fonaux[i];
                    first = 0;
                    pos++;
                    rep = 0;
                }
            }
            if (foncmp[0] != ' ')
                component.Add(foncmp.ToString().Trim());
            return component;
        }
        ///
        /// Converte um ArrayList em uma string onde cada posição do vetor é separada por espaços em branco.
        ///
        ///
        ///
        public static String ArrayListToStr(ArrayList vtr)
        {
            string str = "";
            for (int i = 0; i < vtr.Count; i++)
            {
                str += vtr[i] + " ";
            }
            return str.Trim();
        }
    }
}

Nota:
Créditos para o algoritmo original em Java
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=6300
http://www.incor.usp.br/spdweb/ccssis/fonetica/

Related Posts Plugin for WordPress, Blogger...