2010-02-06 6 views
7

Ich versuche, eine UTF-8-Zeichenfolge (vietnamesisch) in C# Console aufzuschreiben, aber keinen Erfolg. Ich laufe auf Windows 7.Vietnamesisches Zeichen in .NET-Konsolenanwendung (UTF-8)

Ich versuchte, die Encoding Klasse zu verwenden, die string-char[] zu byte[] und dann in String konvertieren, aber keine Hilfe, ist der String-Eingang direkt aus der Datenbank. Hier

ist einige Beispiel

Tôi tên là Đức, Cuoc Lied, das VUI về Tuyet Voi

Es zeigt nicht den besonderen Charakter wie Đ oder ... statt es zeigen bis ?, viel schlimmer als mit der Encoding-Klasse.

Kann jemand dieses ausprobieren oder über dieses Problem wissen?


Mein Code

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)); 
} 

und hier ist die hervorragende Ausgangs

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

die Ausgabe Codierung UTF8 Einstellung sollte funktionieren: 'Console.OutputEncoding = Encoding.UTF8 '. Sind Sie sicher, dass das Problem nicht darin liegt, wie Sie den Text aus der Datenbank lesen? Wenn Sie in Ihrem Code einen Haltepunkt setzen, wird 'srcString' korrekt codiert? –

+0

Ja, der Breakpoint-Ausgang ist 100% in Ordnung. Ich überlege, auf Windows-Form zu verschieben, aber ich brauche nicht so viele ausgefallene Funktionen in diesem Fall. :(zu schlecht für winconsole – DucDigital

Antwort

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(); 
    } 
} 

Screenshot der Ausgabe (Verwendung Consolas oder eine andere Schriftart, die alle oben genannten Zeichen hat):

proof

+1

Die Schriftart ist entscheidend. Ich habe den Code ausprobiert und zuerst eine Müllcodierung, also habe ich nicht erwartet, dass ein Fontwechsel einen Unterschied macht, aber das war der Fall. – Timwi

+1

Das funktioniert wirklich. Danke romkyns – DucDigital

+0

Es scheint, dass 'SetConsoleOutputCP' ist nicht mehr notwendig, um dies zu arbeiten - vielleicht wurde etwas im Framework behoben. –

0

Sie müssen Console.OutputEncoding einstellen UTF-8 anzupassen.

Wahrscheinlich so etwas wie:

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

Ich habe das Beispiel hinzugefügt. Es funktioniert überhaupt nicht, meine Console.OutputEncoding ist ein bisschen anders, dass Ihre, aber es funktioniert auf die gleiche Weise. Ich habe versucht, deins auch immer noch – DucDigital

0

Ist die Schriftart, die Sie im Konsolenfenster verwenden, um die Zeichen unterstützen Sie anzeigen möchten?

+1

Ich habe nicht festgelegt die Schriftart, aber es Naht Luicida kann UTF8 nicht zeigen? Ist es dort, ich kann es on-the-fly mit C# ändern? – DucDigital

-2

ist es das Problem mit cmd.exe Konsole. Es unterstützt keine Unicode. [Nichts mit C# zu tun /. NET]

Versuchen Sie, es in eine GUI-Anwendung zu ändern, wenn Sie oder in eine Datei schreiben können.

+3

-1: Die Konsole ist vollständig Unicode-bewusst. –

+0

Aber es hat nur begrenzte Schriftarten-Unterstützung Beispiel Ich kann nicht in Tamil ausgeben, obwohl ich Unicode-Fonts für diese Sprache im OS habe. Das ist, was ich mit nicht unterstützt Unicode. – Fakrudeen

+0

Ich denke, es unterstützt nur monospaced Schriftarten und wahrscheinlich (nicht sicher!) tut nicht richtig von links nach rechts, aber es sollte in der Lage sein, Tamil zu machen, wenn Sie eine monospaced Schriftart mit tamilischen Buchstaben finden. Ich habe versucht, DejaVu und es scheint sie nicht zu haben. –

Verwandte Themen