Pergunta

Como você pode remover caracteres não-ASCII de uma string? (Em C #)

Foi útil?

Solução

string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);

Outras dicas

Aqui está uma solução .NET pura que não usa expressões regulares:

string inputString = "Räksmörgås";
string asAscii = Encoding.ASCII.GetString(
    Encoding.Convert(
        Encoding.UTF8,
        Encoding.GetEncoding(
            Encoding.ASCII.EncodingName,
            new EncoderReplacementFallback(string.Empty),
            new DecoderExceptionFallback()
            ),
        Encoding.UTF8.GetBytes(inputString)
    )
);

Pode parecer complicado, mas deve ser intuitivo. Ele usa a codificação .NET ASCII para converter uma cadeia. UTF8 é usado durante a conversão, porque ele pode representar qualquer um dos personagens originais. Ele usa um EncoderReplacementFallback para converter qualquer caractere não-ASCII para uma cadeia vazia.

Eu acredito MonsCamus significava:

parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);

Se você não quiser tira, mas para realmente converter Latina acentuado para caracteres não-acentuado, dê uma olhada nesta pergunta: Como faço para traduzir caracteres de 8 bits em caracteres de 7 bits? (Ou seja, U para U)

Inspirado pela de philcruz regular solução Expression , eu fiz uma solução LINQ puro

public static string PureAscii(this string source, char nil = ' ')
{
    var min = '\u0000';
    var max = '\u007F';
    return source.Select(c => c < min ? nil : c > max ? nil : c).ToText();
}

public static string ToText(this IEnumerable<char> source)
{
    var buffer = new StringBuilder();
    foreach (var c in source)
        buffer.Append(c);
    return buffer.ToString();
}

Este é o código não foi testado.

Não há necessidade de regex. basta usar a codificação ...

sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));

Eu encontrei o seguinte intervalo ligeiramente alterado útil para analisar blocos de comentários fora de um banco de dados, isso significa que você não terá que lidar com guia e escapar caracteres que causaria um campo CSV para tornar-se aborrecido.

parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);

Se você quer evitar outros caracteres especiais ou particular, verificação de pontuação tabela ASCII

Eu vim aqui à procura de uma solução para caracteres ASCII estendidos, mas não conseguiram encontrá-lo. O mais próximo que eu encontrei é de bzlm solução . Mas isso só funciona para código ASCII até 127 (obviamente você pode substituir o tipo de codificação em seu código, mas eu acho que foi um pouco complexo de entender. Por isso, compartilhar essa versão). Aqui está uma solução que funciona para códigos ASCII estendidos, ou seja, até 255 que é o ISO 8859-1

Ele encontra e tiras fora caracteres não-ascii (mais de 255)

Dim str1 as String= "â, ??î or ôu🕧� n☁i✑💴++$-💯♓!🇪🚑🌚‼⁉4⃣od;/⏬'®;😁☕😁:☝)😁😁///😍1!@#"

Dim extendedAscii As Encoding = Encoding.GetEncoding("ISO-8859-1", 
                                                New EncoderReplacementFallback(String.empty),
                                                New DecoderReplacementFallback())

Dim extendedAsciiBytes() As Byte = extendedAscii.GetBytes(str1)

Dim str2 As String = extendedAscii.GetString(extendedAsciiBytes)

console.WriteLine(str2)
'Output : â, ??î or ôu ni++$-!‼⁉4od;/';:)///1!@#$%^yz:

Aqui está um violino trabalhando para o código

Substitua a codificação como pela exigência, o descanso deve permanecer o mesmo.

Este não é o ideal em termos de performance, mas uma abordagem Linq bem simples:

string strippedString = new string(
    yourString.Where(c => c <= sbyte.MaxValue).ToArray()
    );

A desvantagem é que todos os "sobreviventes" personagens são primeira colocação em uma matriz do tipo char[] que é então jogado fora após o construtor string há usos mais tempo.

Eu usei esta expressão regex:

    string s = "søme string";
    Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
    return regex.Replace(s, "");

Eu uso essa expressão regular para filtrar os maus caracteres em um nome de arquivo.

Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")

Isso deve ser todos os caracteres permitidos para nomes de arquivos.

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