Pregunta

¿Cómo puede usted tira de caracteres no ASCII de una cadena?(en C#)

¿Fue útil?

Solución

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

Otros consejos

Aquí es un puro .NET solución que no utilice 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 intuitiva.Utiliza el .NETO de la codificación ASCII convertir una cadena de caracteres.UTF8 se utiliza durante la conversión, porque puede representar a cualquiera de los personajes originales.Se utiliza una clase encoderreplacementfallback para convertir cualquier carácter ASCII a una cadena vacía.

Creo MonsCamus decir:

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

Si desea que no tira, pero para convertir latina acentuado a la no-caracteres acentuados, echa un vistazo a esta pregunta: ¿Cómo puedo traducir caracteres de 8 bits en 7bit personajes?(es decir,Ü U)

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

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();
}

Esto no se ha probado el código.

no hay necesidad de regex.sólo el uso de la codificación...

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

He encontrado los siguientes ligeramente alterado rango útil para el análisis de bloques de comentario de una base de datos, esto significa que usted no tendrá que lidiar con la ficha y los caracteres de escape que podría causar un campo CSV a ser molesto.

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

Si usted quiere evitar otros caracteres especiales o particulares de la puntuación de verificación la tabla ascii

Llegué aquí buscando una solución para los caracteres ascii extendidos, pero no podía encontrarlo.El más cercano que he encontrado es bzlm la solución.Pero eso sólo funciona para el Código ASCII de hasta 127(obviamente, usted 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).He aquí una solución que funciona para los códigos ASCII extendidos es decir,hasta 255 que es el ISO 8859-1

Encuentra y elimina los 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:

He aquí una trabajo violín para el código

Reemplazar la codificación como por la exigencia, el resto debe seguir siendo el mismo.

Esta no es la óptima en cuanto al rendimiento, pero una bastante directa, Linq enfoque:

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

El inconveniente es que todos los "supervivientes" de los caracteres se introducen en una matriz de tipo char[] que luego se tiran después de que el string constructor ya no la usa.

He utilizado esta expresión expresión:

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

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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top