Pergunta

Esta questão já tem uma resposta aqui:

Eu encontrei uma resposta como remover caracteres diacríticos sobre stackoverflow, mas você poderia me dizer se é possível mudar caracteres diacrítico para os não-diacrítico?

Oh .. e eu penso em .NET (ou outro se não for possível)

Foi útil?

Solução

Copiar de minha própria resposta para outro pergunta :

Em vez de criar sua própria tabela, você poderia, em vez converter o texto em forma de normalização D, onde os personagens são representados como um personagem de base mais os sinais diacríticos (por exemplo, "A" será substituído por "a" seguido por um combinando acento agudo). Você pode, então, tira tudo o que não é uma letra ASCII.

ainda existem As tabelas, mas agora são os do padrão Unicode.

Você também pode tentar NFKD vez de NFD, para pegar ainda mais casos.

Referências:

Outras dicas

Uma vez que ninguém nunca se preocupou em publicar o código para fazer isso, aqui está:

    // \p{Mn} or \p{Non_Spacing_Mark}: 
    //   a character intended to be combined with another 
    //   character without taking up extra space 
    //   (e.g. accents, umlauts, etc.). 
    private readonly static Regex nonSpacingMarkRegex = 
        new Regex(@"\p{Mn}", RegexOptions.Compiled);

    public static string RemoveDiacritics(string text)
    {
        if (text == null)
            return string.Empty;

        var normalizedText = 
            text.Normalize(NormalizationForm.FormD);

        return nonSpacingMarkRegex.Replace(normalizedText, string.Empty);
    }

Nota: a grande razão para a necessidade de fazer isso é quando você está integrando a um sistema partidário 3 que só faz ascii, mas seus dados estão em unicode. Isso é comum. Suas opções são basicamente: Remover caracteres acentuados, nem tente remover acentos dos caracteres acentuados para tentar preservar o máximo possível da entrada original. Obviamente, isso não é uma solução perfeita, mas é 80% melhor do que simplesmente remover qualquer caractere acima ascii 127.

Ele também pode valer a pena dar um passo atrás e considerar por que você quer fazer isso. Se você está tentando remover as diferenças de caracteres que você considera insignificante, você deve olhar para o algoritmo de agrupamento Unicode. Esta é a maneira padrão de diferenças desrespeito, como caso ou diacríticos quando se comparam cordas para pesquisar ou classificação.

Se você pretende exibir o texto modificado, considere o seu público. O que você pode seguramente filtrar distância é local sensível. Em US Inglês, "Igloo" = "iglu", e "currículo" = "currículo", mas em turco, um caso menor I é I (dotless), e em francês, significa cote citar, lado meio côté e meios côte costa. Assim, a linguagem agrupamento determina o que as diferenças são significativas.

Se a remoção diacríticos é a solução certa para a sua aplicação, é mais seguro para produzir sua própria tabela para a qual você adicionar explicitamente os caracteres que você deseja converter.

A abordagem geral, automatizado pode ser concebido utilizando decomposição Unicode. Com isso, você pode decompor um personagem com diacríticos para caracteres "combinando" (os sinais diacríticos) eo caractere base com a qual eles são combinados. Filtrar qualquer coisa que é um personagem combinando, e você deve ter os "não-diacrítico".

A falta de discriminação no método automatizado, no entanto, poderia ter alguns efeitos inesperados. Eu recomendo uma série de testes em um órgão representativo de texto.

Para um exemplo simples:

Para remover sinais diacríticos de uma string:

string newString = myDiacriticsString.Normalize(NormalizationForm.FormD);

Meu site entradas dados de fontes externas que têm muitos caracteres estranhos. Eu escrevi a seguinte função C # para substituir caracteres acentuados e retirar caracteres do teclado não-norte-americanos usando Regex:

    using System.Text;
    using System.Text.RegularExpressions;

    internal static string SanitizeString(string source)
    {
        return Regex.Replace(source.Normalize(NormalizationForm.FormD), @"[^A-Za-z 0-9 \.,\?'""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*", string.Empty).Trim();    
    }

Hope isso ajuda.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top