2009-03-20 25 views
17

Por ejemplo: "½" o ASCII diciembre 189. Cuando leí los bytes de un archivo de texto El byte [] contiene el valor válido, en este caso 189.¿Cómo puedo convertir Ascii extendido a System.String?

La conversión a Unicode resultados en el carácter Unicode de reemplazo 65533

UnicodeEncoding.Unicode.GetString (b);

Convirtiendo a ASCII resultados en 63 o "?"

ASCIIEncoding.ASCII.GetString (b);

Si esto no es posible, ¿cuál es la mejor manera de manejar estos datos? Me gustaría poder realizar funciones de cadena como Reemplazar().

Respuesta

24

Byte 189 representa un "½" en iso-8859-1 (también conocido como "Latin-1"), por lo que el siguiente es quizá lo que quiere:

var e = Encoding.GetEncoding("iso-8859-1"); 
var s = e.GetString(new byte[] { 189 }); 

Todas las cadenas y caracteres en .NET son Codificado en UTF-16, por lo que necesita usar un codificador/decodificador para convertir cualquier cosa, a veces esto está predeterminado (por ejemplo, UTF-8 para instancias de FileStream), pero una buena práctica es especificar siempre.

Necesitará alguna forma de metadatos implícitos o (mejor) explícitos para proporcionarle la información sobre qué codificación.

+1

Este material de codificación me ha estado volviendo loco ... ¡pero tu respuesta hizo el truco para mí! Me tomó un tiempo averiguar qué buscar, pero finalmente descubrí cuáles deberían ser los términos de búsqueda adecuados. :) Gracias por brindarme una solución simple a mi problema. :) – Dave

10

Depende de qué es exactamente la codificación.

No existe el "ASCII 189" - ASCII solo sube a 127. Hay muchas codificaciones que codifican 8 bits utilizando ASCII para los primeros 128 valores.

Usted puede Encoding.Default desee (que es la codificación predeterminada para su sistema en particular), pero es difícil saber a ciencia cierta. ¿De dónde provienen tus datos?

+0

lo que estoy leyendo en el byte [] se alinea con 188 - 190 en este cuadro ascii extendido: http://charlie.balch.org/asp/ascii.asp. Encoding.Default hizo el truco.¡Gracias un montón! – rtremaine

+1

Me alegro de que funcionó, solo tenga en cuenta que cualquiera que hable de "ASCII extendido" como si eso significara una codificación en particular, no sabe de lo que están hablando. Es como hablar de "un dólar": un dólar estadounidense, un dólar australiano, un dólar canadiense, ¿qué? Puede tener sentido en un contexto particular –

+0

pero no es una idea definitiva y única. Así que me atrevo a decir que la idea de Charlie de "ASCII extendido" es apropiada para * su * cultura, pero no coincidiría con lo que sucede en las computadoras de otras personas. –

12

El viejo conjunto de caracteres PC-8 o Extended ASCII existía antes que IBM y Microsoft introdujo la idea de Code Pages para el mundo de las PC. Esto WAS Extended ASCII - en 1982. De hecho, era el ÚNICO juego de caracteres disponible en la PC en ese momento, hasta que la tarjeta EGA le permitió cargar otras fuentes en VRAM.

Este fue también el estándar predeterminado para terminales ANSI, y casi todos los BBS que llamé en los años 80 y principios de los 90 usaban este conjunto de caracteres para mostrar menús y cajas.

Aquí está el código para convertir ASCII extendido de 8 bits en texto Unicode. Tenga en cuenta la clave clave del código: GetEncoding ("437"). Eso usó la Página de códigos 437 para traducir el texto ASCII de 8 bits al equivalente Unicode.

string ASCII8ToString(byte[] ASCIIData) 
    { 
     var e = Encoding.GetEncoding("437"); 
     return e.GetString(ASCIIData); 
    } 
+0

¡Guau! ¡Gracias! Como nota al margen, tu respuesta también es una muy buena solución para convertir una matriz de bytes en una cadena y volver. – mike

1

System.String[] no puede almacenar caracteres con ASCII > 127 si usted está tratando de trabajar en todos los caracteres ASCII extendidos como œ ¢ ½ ¾here es el método para convertirlo en su equivalente binario y decimal

Cuestiones relacionadas