¿Cómo puedes quitar caracteres no ASCII de una cadena? (en C#)


¿Cómo se pueden eliminar caracteres no ASCII de una cadena? (en C#)

 192
Author: bzlm, 2008-09-23

11 answers

string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
 367
Author: philcruz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-18 03:51:59

Aquí hay una solución. NET pura que no usa expresiones 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)
            )
        );

Puede parecer engorroso, pero debe ser intuitivo. Utiliza la codificación. NET ASCII para convertir una cadena. UTF8 se utiliza durante la conversión porque puede representar cualquiera de los caracteres originales. Utiliza un EncoderReplacementFallback to para convertir cualquier carácter no ASCII en una cadena vacía.

 103
Author: bzlm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-25 20:05:22

Creo que MonsCamus quiso decir:

parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);
 28
Author: Josh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-25 20:46:26

Si no quieres desnudar, sino convertir caracteres latinos acentuados a caracteres no acentuados, echa un vistazo a esta pregunta: ¿Cómo traduzco caracteres de 8 bits a caracteres de 7 bits? (es decir, Ü a U)

 14
Author: sinelaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:23

Inspirado por la solución de Expresión Regular de philcruz , he hecho una solución pura de LINQ

    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 es un código no probado.

 9
Author: Bent Rasmussen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:40

No hay necesidad de expresiones regulares. solo usa codificación...

sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
 5
Author: rjp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-18 17:56:45

Encontré útil el siguiente rango ligeramente alterado para analizar bloques de comentarios de una base de datos, esto significa que no tendrá que lidiar con caracteres de tabulación y escape que causarían que un campo CSV se alterara.

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

Si desea evitar otros caracteres especiales o puntuación particular, verifique la tabla ascii

 4
Author: MonsCamus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-01 10:02:56

Esto no es un rendimiento óptimo, sino un enfoque Linq bastante sencillo:

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

El inconveniente es que todos los caracteres "sobrevivientes" se colocan primero en una matriz de tipo char[] que luego se tira después de que el constructor string ya no lo usa.

 2
Author: Jeppe Stig Nielsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-03 17:08:42

Vine aquí buscando una solución para caracteres ascii extendidos, pero no pude encontrarla. Lo más cercano que encontré es la solución de bzlm. Pero eso solo funciona para código ASCII hasta 127 (obviamente, puede reemplazar el tipo de codificación en su código, pero creo que fue un poco complejo de entender. Por lo tanto, compartir esta versión). Aquí hay una solución que funciona para códigos ASCII extendidos, es decir, hasta 255 que es el ISO 8859-1

Encuentra y elimina caracteres no ascii (mayor que 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:

Aquí hay un violín de trabajo para el código

Reemplace la codificación según el requisito, rest debe seguir siendo el mismo.

 2
Author: TheUknown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:23

Usé esta expresión regex:

    string s = "søme string";
    Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
    return regex.Replace(s, "");
 1
Author: Anonymous coward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-12 12:27:20

Uso esta expresión regular para filtrar los caracteres malos en un nombre de archivo.

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

Estos deben ser todos los caracteres permitidos para los nombres de archivo.

 0
Author: user890332,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-09 18:17:02