Pregunta

Tengo un objeto de cadena

" con múltiples caracteres e incluso caracteres especiales "

Estoy tratando de usar

UTF8Encoding utf8 = new UTF8Encoding();
ASCIIEncoding ascii = new ASCIIEncoding();

objetos para convertir esa cadena a ascii. ¿Puedo pedirle a alguien que traiga algo de luz a esta tarea simple, que es cazar mi tarde?

EDITAR 1: Lo que estamos tratando de lograr es deshacernos de caracteres especiales como algunos de los apóstrofes de ventanas especiales. El código que publiqué a continuación como respuesta no se ocupará de eso. Básicamente

  

O'Brian se convertirá en O? Brian. donde 'es uno de los apóstrofes especiales

¿Fue útil?

Solución

Esto fue en respuesta a su otra pregunta, parece que se ha eliminado ... el punto sigue en pie.

Parece un problema clásico de Unicode a ASCII . El truco sería encontrar dónde está sucediendo.

.NET funciona bien con Unicode, suponiendo que se le dice que es Unicode para comenzar (o izquierda en el valor predeterminado).

Mi adivinanza es que su aplicación receptora no puede manejarlo. Por lo tanto, probablemente utilizaría el ASCIIEncoder con an EncoderReplacementFallback con String.Empty:

using System.Text;

string inputString = GetInput();
var encoder = ASCIIEncoding.GetEncoder();
encoder.Fallback = new EncoderReplacementFallback(string.Empty);

byte[] bAsciiString = encoder.GetBytes(inputString);

// Do something with bytes...
// can write to a file as is
File.WriteAllBytes(FILE_NAME, bAsciiString);
// or turn back into a "clean" string
string cleanString = ASCIIEncoding.GetString(bAsciiString); 
// since the offending bytes have been removed, can use default encoding as well
Assert.AreEqual(cleanString, Default.GetString(bAsciiString));

Por supuesto, en los viejos tiempos, simplemente hacíamos un bucle y eliminamos cualquier carácter mayor que 127 .. . Bueno, aquellos de nosotros en los Estados Unidos al menos. ;)

Otros consejos

Pude resolverlo. En caso de que alguien quiera saber a continuación el código que funcionó para mí:

ASCIIEncoding ascii = new ASCIIEncoding();
byte[] byteArray = Encoding.UTF8.GetBytes(sOriginal);
byte[] asciiArray = Encoding.Convert(Encoding.UTF8, Encoding.ASCII, byteArray);
string finalString = ascii.GetString(asciiArray);

Avísame si hay una manera más sencilla de hacerlo.

Para cualquiera a quien le gusten los métodos de Extensión, este es el truco para nosotros.

using System.Text;

namespace System
{
    public static class StringExtension
    {
        private static readonly ASCIIEncoding asciiEncoding = new ASCIIEncoding();

        public static string ToAscii(this string dirty)
        {
            byte[] bytes = asciiEncoding.GetBytes(dirty);
            string clean = asciiEncoding.GetString(bytes);
            return clean;
        }
    }
}

(Espacio de nombres del sistema, por lo que está disponible de forma bastante automática para todas nuestras cadenas).

Basado en la respuesta de Mark anterior (y el comentario de Geo), creé una versión de dos líneas para eliminar todos los casos de excepción ASCII de una cadena. Proporcionado a las personas que buscan esta respuesta (como lo hice yo).

using System.Text;

// Create encoder with a replacing encoder fallback
var encoder = ASCIIEncoding.GetEncoding("us-ascii", 
    new EncoderReplacementFallback(string.Empty), 
    new DecoderExceptionFallback());

string cleanString = encoder.GetString(encoder.GetBytes(dirtyString)); 

Si desea una representación de 8 bits de caracteres que se utilizan en muchas codificaciones, esto puede ayudarlo.

Debe cambiar la variable targetEncoding a la codificación que desee.

Encoding targetEncoding = Encoding.GetEncoding(874); // Your target encoding
Encoding utf8 = Encoding.UTF8;

var stringBytes = utf8.GetBytes(Name);
var stringTargetBytes = Encoding.Convert(utf8, targetEncoding, stringBytes);
var ascii8BitRepresentAsCsString = Encoding.GetEncoding("Latin1").GetString(stringTargetBytes);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top