2009-02-26 20 views
49

Estoy usando el siguiente código para leer un archivo de texto que contiene caracteres extraños, el archivo está codificado ANSI y se ve bien en el bloc de notas. El código siguiente no funciona, cuando los valores de los archivos se leen y se muestran en la cuadrícula de datos, los caracteres aparecen como cuadrados, ¿podría haber otro problema en otro lugar?C# Ayuda a leer caracteres extranjeros usando StreamReader

StreamReader reader = new StreamReader(inputFilePath, System.Text.Encoding.ANSI); 
using (reader = File.OpenText(inputFilePath)) 

Gracias

Actualización 1: He intentado todas las codificaciones que se encuentran bajo System.Text.Encoding. y todos fallan al mostrar el archivo correctamente.

Actualización 2: Cambié la codificación del archivo (volvió a guardar el archivo) a unicode y usé System.Text.Encoding.Unicode y funcionó bien. Entonces, ¿por qué el bloc de notas lo leyó correctamente? ¿Y por qué no System.Text.Encoding.Unicode leyó el archivo ANSI?

+0

¿Estás seguro de que está codificado en ANSI? A veces el Bloc de notas intentará una "mejor estimación" y utilizará una codificación diferente a la esperada. –

+0

Si el bloc de notas determina que un archivo no es Unicode o UTF-8, recurrirá a la configuración regional del sistema (configurado en el panel de control -> Área de región e idioma). –

Respuesta

21

Sí, podría ser con la codificación real del archivo, probablemente unicode. Pruebe con UTF-8 ya que es la forma más común de codificación Unicode. De lo contrario, si el archivo ASCII, la codificación ASCII estándar debería funcionar.

+0

UTF8Encoding.UTF8 funcionó para mí. –

5

Pruebe con una codificación diferente como Encoding.UTF8. También puede intentar dejar que StreamReader encuentre la codificación en sí:

StreamReader reader = new StreamReader(inputFilePath, System.Text.Encoding.UTF8, true) 

Editar: Acaba de ver su actualización. Intenta dejar que StreamReader adivine.

108

También puede probar la codificación predeterminada, que utiliza la página de códigos ANSI del sistema actual.

StreamReader reader = new StreamReader(inputFilePath, Encoding.Default, true) 

Cuando intenta utilizar el Bloc de notas "Guardar como" del menú con el archivo original, mira el cuadro de codificación combinado. Le dirá qué libreta de codificación adivinó es utilizada por el archivo.

Además, si se trata de un archivo ANSI, el parámetro detectEncodingFromByteOrderMarks probablemente no ayude mucho.

+1

Usar la codificación predeterminada funcionó para mí. Tenía la char (Â) que estaba siendo omitida por StreamReader y cambiándola a la codificación predeterminada permitida para ser leída correctamente. ¡Gracias! – buzzzzjay

+1

Encoding.Default funcionó para mí ... ¿Los caracteres españoles en formato ANSI se leerían y escribirían como%^y? antes de usar Encoding.Default. – BoilerBrad

+0

Encoding.Default funciona también para mí. Caracteres portugueses por aquí. –

8

Usando la codificación. Unicode no decodificará con precisión un archivo ANSI de la misma manera que un decodificador JPEG no entenderá un archivo GIF.

me sorprende que Encoding.Default no funcionó para el archivo ANSI si realmente era ANSI - si alguna vez saber exactamente lo que página de códigos Bloc de notas estaba usando, podría utilizar Encoding.GetEncoding(int).

En general, cuando sea posible, recomendaría usar UTF-8.

3

File.OpenText() siempre usa un StreamReader UTF-8 implícitamente. Cree su propia instancia de StreamReader en su lugar y especifique la codificación deseada. como

using (StreamReader reader = new StreamReader(@"C:\test.txt", Encoding.Default) 
{ 
// ... 
} 
18

que tenía el mismo problema y mi solución era simple: en lugar de

Encoding.ASCII 

uso

Encoding.GetEncoding("iso-8859-1") 

La respuesta fue encontrada here.

Editar: más soluciones. Éste tal vez más precisa:

Encoding.GetEncoding(1252); 

Además, en algunos casos, esto va a funcionar para usted también si su sistema operativo por defecto de codificación coincide con la codificación del archivo:

Encoding.Default; 
+0

Mi problema era usar 'StringBuilder' y dar salida a' HttpResponseMessage', y los acentos estaban siendo reemplazados. Esto funcionó, ('result' es' HttpResponseMessage') 'result.Content = new StringContent (csv.ToString(), Encoding.GetEncoding (" iso-8859-1 "));' –

+0

Este era yo también. Por alguna razón, 'new StreamReader (memoryStream, Encoding.UTF8)' no funcionaba, pero 'new StreamReader (memoryStream, Encoding.GetEncoding (" iso-8859-1 "))' lo hizo! –

+0

Resolvió mi problema con un ¾ (extended ascii, no unicode) que alguien decidió usar. –

0

he resuelto mi problema de lectura de caracteres portugués, cambiando el archivo fuente en el bloc de notas ++.

enter image description here

C#

var url = System.Web.HttpContext.Current.Server.MapPath(@"~/Content/data.json"); 
    string s = string.Empty; 
    using (System.IO.StreamReader sr = new System.IO.StreamReader(url, System.Text.Encoding.UTF8,true)) 
    { 
      s = sr.ReadToEnd(); 
    } 
0

para árabe, solía Encoding.GetEncoding(1256). está funcionando bien.

Cuestiones relacionadas