2010-02-06 17 views
7

Estoy tratando de escribir una cadena UTF-8 (vietnamita) en la consola C# pero no lo conseguí. Estoy corriendo en Windows 7.Personaje vietnamita en .NET Console Application (UTF-8)

He intentado utilizar la clase Encoding que convierten a stringchar[] a byte[] y luego a cadena, pero sin ayuda, la cadena es de entrada directamente desde la base de datos.

Aquí es un poco de ejemplo

Tôi tên là Đức, Cuoc canción que VUI VE Tuyết Voi

No muestra el carácter especial como Đ o ... en cambio, muestran hasta ?, mucho peor que con la clase de Codificación.

¿Alguien puede probar esto o saber acerca de este problema?


Mi código

static void Main(string[] args) 
{ 
    XDataContext _new = new XDataContext(); 
    Console.OutputEncoding = Encoding.GetEncoding("UTF-8"); 
    string srcString = _new.Posts.First().TITLE; 

    Console.WriteLine(srcString); 
    // Convert the UTF-16 encoded source string to UTF-8 and ASCII. 
    byte[] utf8String = Encoding.UTF8.GetBytes(srcString); 
    byte[] asciiString = Encoding.ASCII.GetBytes(srcString); 

    // Write the UTF-8 and ASCII encoded byte arrays. 
    Console.WriteLine("UTF-8 Bytes: {0}", BitConverter.ToString(utf8String)); 
    Console.WriteLine("ASCII Bytes: {0}", BitConverter.ToString(asciiString)); 


    // Convert UTF-8 and ASCII encoded bytes back to UTF-16 encoded 
    // string and write. 
    Console.WriteLine("UTF-8 Text : {0}", Encoding.UTF8.GetString(utf8String)); 
    Console.WriteLine("ASCII Text : {0}", Encoding.ASCII.GetString(asciiString)); 

    Console.WriteLine(Encoding.UTF8.GetString(utf8String)); 
    Console.WriteLine(Encoding.ASCII.GetString(asciiString)); 
} 

y aquí está la salida excepcional

Nhà báo đi hội báo Xuân 
UTF-8 Bytes: 4E-68-C3-A0-20-62-C3-A1-6F-20-C4-91-69-20-68-E1-BB-99-69-20-62-C3- 
A1-6F-20-58-75-C3-A2-6E 
ASCII Bytes: 4E-68-3F-20-62-3F-6F-20-3F-69-20-68-3F-69-20-62-3F-6F-20-58-75-3F- 
6E 
UTF-8 Text : Nhà báo đi hội báo Xuân 
ASCII Text : Nh? b?o ?i h?i b?o Xu?n 
Nhà báo đi hội báo Xuân 
Nh? b?o ?i h?i b?o Xu?n 


Press any key to continue . . . 
+1

Ajuste de la codificación de salida a UTF8 debería funcionar: 'Console.OutputEncoding = Encoding.UTF8 '. ¿Estás seguro de que el problema no proviene de la forma en que estás leyendo el texto de la base de datos? Si coloca un punto de interrupción en su código, ¿'srcString' está codificado correctamente? –

+0

sí, la salida del punto de interrupción es 100% correcta. Estoy considerando cambiar a la forma de Windows pero no necesito esa característica tan elegante en este caso. :(demasiado malo para WinConsole – DucDigital

Respuesta

7
class Program 
{ 
    [DllImport("kernel32.dll")] 
    static extern bool SetConsoleOutputCP(uint wCodePageID); 

    static void Main(string[] args) 
    { 
     SetConsoleOutputCP(65001); 
     Console.OutputEncoding = Encoding.UTF8; 
     Console.WriteLine("tést, тест, τεστ, ←↑→↓∏∑√∞①②③④, Bài viết chọn lọc"); 
     Console.ReadLine(); 
    } 
} 

Captura de pantalla de la salida (uso Consolas u otra fuente que tiene todos los caracteres anteriores):

proof

+1

La fuente es crucial. Probé el código y al principio obtuve la codificación basura, así que no esperaba que un cambio de fuente marcara la diferencia, pero lo hizo. – Timwi

+1

Esto está realmente funcionando. Gracias romkyns – DucDigital

+0

Parece que 'SetConsoleOutputCP' ya no es necesario para hacer que esto funcione, tal vez algo se solucionó en el marco. –

0

Usted tendrá que configurar para que coincida con Console.OutputEncodingUTF-8.

Probablemente algo como:

Console.OutputEncoding = System.Text.Encoding.UTF8; 
+1

He añadido el ejemplo. No está funcionando en absoluto, mi Console.OutputEncoding es un poco diferente que el suyo, pero que funcionan de la misma manera. Probé el suyo también, siendo el mismo – DucDigital

0

¿La fuente que utiliza en la ventana de consola admite los caracteres que están tratando de mostrar?

+1

No me propuse ? la fuente, pero la costura luicida no puede mostrar UTF8 es hay alguna forma de cambiarlo en la marcha con C# – DucDigital

-2

es el problema con la consola cmd.exe. No es compatible con Unicode. [Nada que ver con C# /. NET]

pruebe a cambiar a una aplicación de interfaz gráfica de usuario si se puede o escribir en un archivo.

+3

-1:? la consola es totalmente compatibles con Unicode –

+0

pero solo se admite de fuentes limitadas Por.. Por ejemplo, no puedo editar en Tamil, aunque tengo fuentes Unicode para ese idioma en el sistema operativo. Eso es lo que quise decir con que no es compatible con Unicode. – Fakrudeen

+0

Creo que solo es compatible con fuentes monoespaciadas, y probablemente (¡no estoy seguro!) no funciona correctamente de derecha a izquierda, pero debería poder hacer Tamil si encuentra una fuente monoespaciada con caracteres Tamil. Probé DejaVu y parece que no los tiene. –

Cuestiones relacionadas