2010-09-23 123 views
5

Tengo un problema al convertir un archivo de texto de ANSI a UTF8 en C#. Intento mostrar los resultados en un navegador.Convirtiendo el problema ANSI en UTF8 C#

Tengo un archivo de texto con muchos caracteres de acento. Está codificado en ANSI, así que tengo que convertirlo a utf8 porque en el navegador aparece el "?" En lugar de los acentos. No importa cómo intenté convertir a UTF8 todavía era un "?". Pero si convierto el archivo de texto en notepad ++ a utf8, los caracteres de acento se mostrarán bien.

aquí es una paz de codificación de código que he hecho:

public string Encode(string text) 
    { 
     // encode the string as an ASCII byte array 
     byte[] myASCIIBytes = ASCIIEncoding.ASCII.GetBytes(text); 

     // convert the ASCII byte array to a UTF-8 byte array 
     byte[] myUTF8Bytes = ASCIIEncoding.Convert(ASCIIEncoding.ASCII, UTF8Encoding.UTF8, myASCIIBytes); 

     // reconstitute a string from the UTF-8 byte array 
     return UTF8Encoding.UTF8.GetString(myUTF8Bytes); 
    } 

¿Tiene alguna idea de por qué sucede esto?

+0

ASCII es la codificación de 7 bits w/o la página de códigos, como explica Andrei. Si tiene caracteres de acento, no debe usar ASCII. –

Respuesta

14

¿Tiene alguna idea de por qué sucede esto?

Sí, ya es demasiado tarde. Debe especificar ANSI cuando lea la cadena del archivo. En la memoria, siempre es Unicode (UTF16).

+1

+1 Sí, el texto ya está destruido antes de ingresar a la función. –

0

Mi idea aquí es cuando guarde el archivo en el Bloc de notas ++ inserta el Byte-Order-Mark para que el navegador pueda inferir que es UTF8 a partir de esto. De lo contrario, probablemente tenga que indicar explícitamente al navegador la codificación de caracteres, como en la DTD, en XML, etc.

0

Esto probablemente esté sucediendo porque su string text original ya contiene caracteres no válidos. La conversión de codificación solo tiene sentido si su entrada es una matriz de bytes. Por lo tanto, debe leer el archivo como conjunto de bytes en lugar de cadena, o, como dijo Henk, especificar la codificación para leer el archivo.

7

Cuando convierte a ASCII inmediatamente pierde todos los caracteres no ingleses (incluidos los que tienen acento) porque ASCII solo tiene 127 (7 bits) de caracteres.

Hace una manipulación extraña. string en .net está en UTF-16, por lo que una vez que devuelva string, no byte[], esto no importa.

creo que debe hacer: (supongo que por ANSI quiere decir Latin1)

public byte[] Encode(string text) 
{ 
    return Encoding.GetEncoding(1252).GetBytes(text); 
} 

Dado que la cuestión no era muy claro que hay una observación razonable de que en realidad se podría necesitar éste:

public string Decode(byte[] data) 
{ 
    return Encoding.GetEncoding(1252).GetString(data); 
} 
+0

+1 para las cosas de CodePage, pero creo que tienes una dirección equivocada aquí. El operador necesita leer 'byte []' y una función para convertir ** a ** 'string'. –

+0

@Henk Holterman tengo la sensación de que no entendí bien al que pregunta.pero su función toma 'string' y devuelve' string' así que no estoy seguro – Andrey

+0

Creo que necesitamos una 'cadena Decode (byte [])' –

4

Esta es probablemente la manera más fácil:

byte[] ansiBytes = File.ReadAllBytes("inputfilename.txt"); 
var utf8String = Encoding.Default.GetString(ansiBytes); 
File.WriteAllText("outputfilename.txt", utf8String); 
+0

¿Cómo funciona esto? ¿GetString() detecta qué codificación se utilizó en el archivo de entrada? ¿O simplemente funciona porque los puntos de código UTF-8 se asignan correctamente a la página de códigos Latin1? –