2010-02-06 24 views
7

Tôi đang cố gắng viết một chuỗi UTF-8 (tiếng Việt) thành C# Console nhưng không thành công. Tôi đang chạy trên Windows 7.Ký tự tiếng Việt trong ứng dụng .NET Console (UTF-8)

Tôi cố gắng để sử dụng lớp Encoding chuyển đổi string-char[] để byte[] và sau đó đến String, nhưng không có sự giúp đỡ, chuỗi được nhập trực tiếp từ cơ sở dữ liệu.

Dưới đây là một số ví dụ

Tôi tên là Đức, cuộc sống thật vui vẻ tuyệt vời

Nó không hiển thị các ký tự đặc biệt như Đ hoặc ... thay vào đó nó cho thấy lên ?, tệ hơn nhiều so với lớp Encoding.

Có ai có thể dùng thử hoặc biết về sự cố này không?


Mã của tôi

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

và đây là sản phẩm nổi bật

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

Thiết lập mã hóa đầu ra để UTF8 nên làm việc: 'Console.OutputEncoding = Encoding.UTF8 '. Bạn có chắc chắn rằng vấn đề không phải là từ cách bạn đang đọc văn bản từ cơ sở dữ liệu? Nếu bạn đặt điểm ngắt trong mã của mình, 'srcString' có được mã hóa chính xác không? –

+0

có, đầu ra điểm ngắt là 100% tiền phạt. Tôi đang xem xét di chuyển đến cửa sổ hình thức nhưng tôi không cần nhiều tính năng ưa thích trong trường hợp này. :(quá xấu cho winconsole – DucDigital

Trả lời

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

Ảnh chụp màn hình của đầu ra (sử dụng Consolas này hay cách khác font chữ có tất cả các ký tự trên):

proof

+1

Phông chữ rất quan trọng. Tôi đã thử mã và tôi đã có mã hóa rác lúc đầu, vì vậy tôi đã không mong đợi một chuyển đổi phông chữ để tạo sự khác biệt, nhưng nó đã làm. – Timwi

+1

Điều này thực sự hiệu quả. Cảm ơn romkyns – DucDigital

+0

Dường như 'SetConsoleOutputCP' không còn cần thiết để làm việc này nữa - có lẽ đã có một cái gì đó đã được sửa trong khung công tác. –

0

Bạn sẽ cần phải thiết lập để phù hợp với Console.OutputEncodingUTF-8.

Có lẽ cái gì đó như:

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

Tôi đã thêm ví dụ. Nó không hoạt động chút nào, Console.OutputEncoding của tôi hơi khác một chút nhưng nó hoạt động theo cùng một cách. Tôi đã thử bạn quá, vẫn giữ nguyên – DucDigital

0

Liệu font bạn sử dụng trong cửa sổ Console hỗ trợ các ký tự mà bạn đang cố gắng để hiển thị?

+1

Tôi chưa đặt phông chữ, nhưng nó seam luicida không thể hiển thị UTF8? là có anyway tôi có thể thay đổi nó on-the-fly với C#? – DucDigital

-2

đó là vấn đề với giao diện điều khiển cmd.exe. Nó không hỗ trợ unicode. [Không có gì để làm với C# /. NET]

Thử thay đổi nó thành ứng dụng GUI nếu bạn có thể hoặc ghi vào một tệp.

+3

-1: Giao diện điều khiển là hoàn toàn nhận thức Unicode –

+0

Nhưng nó chỉ hỗ trợ phông chữ hạn chế. Ví dụ tôi không thể xuất ra bằng tiếng Tamil, mặc dù tôi có phông chữ unicode cho ngôn ngữ đó trong hệ điều hành. Đó là ý tôi không hỗ trợ unicode – Fakrudeen

+0

Tôi nghĩ nó chỉ hỗ trợ phông chữ đơn cách, và có lẽ (không chắc chắn!) không thực hiện đúng từ phải sang trái, nhưng nó có thể làm tiếng Tamil nếu bạn tìm thấy một phông chữ đơn cách với các ký tự Tamil. Tôi đã thử DejaVu và dường như không có chúng. –

Các vấn đề liên quan