2012-03-06 29 views
6

Estoy tratando de hacer algo que creo que debería ser bastante simple, pero ya he invertido demasiado tiempo en él y he intentado varios enfoques diferentes que investigué pero fueron en vano.C# UTF8 Lectura/Salida

Básicamente, tengo una gran lista de nombres que tienen caracteres "especiales" en ellos del juego de caracteres UTF8.

Mi objetivo final es leer en cada nombre, y luego hacer una solicitud HTTP usando ese nombre en la URL como una variable GET.

Mi primer objetivo fue leer un nombre de un archivo, y ponerlo en estándar para confirmar que podía leer y escribir correctamente UTF8, antes de crear las cadenas y hacer todas las solicitudes HTTP.

El archivo test1.txt hice contenían sólo esta contenido:

OWNAGE

Luego utiliza el código C# para leer en el archivo. Establecí la codificación StreamReader y Console.OutputEncoding en UTF8.

static void Main(string[] args) 
{ 
    Console.OutputEncoding = System.Text.Encoding.UTF8; 

    using (StreamReader reader = new StreamReader("test1.txt",System.Text.Encoding.UTF8)) 
    { 
     string line; 

     while ((line = reader.ReadLine()) != null) 
     { 
      Console.WriteLine(line); 
     } 

    } 

    Console.ReadLine(); 
} 

Para mi sorpresa me sale este tipo de salida:

enter image description here

salida esperada es exactamente el mismo que el contenido del archivo originales.

¿Cómo puedo estar seguro de que las cadenas que voy a construir para realizar solicitudes HTTP serán correctas si no puedo siquiera hacer una tarea simple como leer/escribir cadenas UTF8?

Respuesta

6

Su programa está bien (suponiendo que el archivo de entrada es en realidad UTF-8). Si depura su programa y utiliza la ventana Inspección para ver las cadenas (la variable line), encontrará que es correcto. Ese es cómo puede estar seguro de que enviará las solicitudes HTTP correctas (o cualquier otra cosa que haga con las cadenas).

Lo que está viendo es un error en la consola de Windows.

Afortunadamente, solo afecta a las fuentes de trama. Si cambia la ventana de la consola para usar una fuente TrueType, p. Consola Consolas o Lucida, el problema desaparece.

screenshot

Puede configurar esto para todas las ventanas futuras mediante el uso de la opción de menú “valores predeterminados”:

screenshot

+1

+1 Esto es correcto. También asegúrese de guardar su archivo de muestra usando UTF-8 y no ANSI que es el predeterminado en el Bloc de notas. – Yuck

+0

Esto, junto con la sugerencia de Yuck de asegurarme de haber seleccionado UTF-8 en lugar de ANSI al guardar el archivo resuelto. Gracias chicos me salvaste un montón de dolores de cabeza, estoy seguro! – user17753

3

Ver Reading unicode from console

Si está utilizando .NET 4 tendrá que utilizar

Console.InputEncoding = Encoding.Unicode; 
    Console.OutputEncoding = Encoding.Unicode; 

y asegurarse de que está utilizando Lucida Console como la fuente de la consola.

Si está usando .NET 3.5 probablemente no tenga suerte.

Para leer de manera eficiente las líneas de un archivo, probablemente, me gustaría utilizar:

foreach(var line in File.ReadAllLines(path, Encoding.UTF8)) 
{ 
    // do stuff 
} 
+0

Eso produce un error de 'IOException' cuando lo pruebo. – Yuck

+0

¿Cuál es el mensaje en la excepción? – Phil

+0

* El parámetro es incorrecto. * Y está en la primera línea 'Console.InputEncoding = Encoding.Unicode;'. Usando .NET 4 también. – Yuck

1

Para leer todos los caracteres como lo menciones Debe utilizar la codificación por defecto como éste

new StreamReader(@"E:\database.txt", System.Text.Encoding.Default))