2012-10-04 28 views
13

Tôi đang thử nghiệm với các ký tự unicode và lấy giá trị unicode từ Wikipedia trangLàm thế nào để làm cho giao diện điều khiển có thể in bất kỳ 65535 ký tự UNICODE

IHE vấn đề được bàn điều khiển màn hình của tôi tất cả các C0 Controls và cơ bản Latin ký tự unicode tức là từ U + 0000 đến U + 00FF nhưng đối với tất cả các danh mục khác như Latin mở rộng -B, Cyrillic, các languges khác, v.v. bảng điều khiển in ký tự dấu chấm hỏi (?).

Mã của tôi C# là

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace DataTypes 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      char ch = '\u0181'; 



      Console.WriteLine("the unicode character is value" + ch); 

     } 
    } 
} 

tôi đang làm việc trên cửa sổ 7, Visual Studio 2010. Những gì tôi nên làm gì để tăng cường hỗ trợ Unicode.

+3

Bạn có thể cần thay đổi mã hoặc bảng chữ cái của bảng điều khiển; xem http://stackoverflow.com/questions/1259084/what-encoding-code-page-is-cmd-exe-using – nneonneo

+3

Điều này không giống như giới hạn của C# /. NET, nhưng đúng hơn là: giới hạn của bảng điều khiển . Ví dụ, giao diện điều khiển của tôi nằm trong ["ibm850"] (http://en.wikipedia.org/wiki/Code_page_850), một trang mã 8 bit - không có khả năng viết unicode đầy đủ trên "ibm850". –

+1

Chỉ có ba phông chữ có sẵn trên bàn điều khiển của tôi ... Lucida, Consolas, Raster ... là do giới hạn này? –

Trả lời

19

Có rất nhiều lịch sử đằng sau câu hỏi đó, tôi sẽ nói về nó trong một thời gian đầu tiên. Ứng dụng chế độ Console chỉ có thể hoạt động với mã hóa văn bản 8 bit. Điều này quay trở lại một quyết định thiết kế được thực hiện 42 năm trước bởi Ken Thompson và cộng sự khi họ thiết kế Unix. Một tính năng cốt lõi của Unix là thiết bị đầu cuối I/O được thực hiện thông qua các đường ống và bạn có thể nối các đường ống lại với nhau để cung cấp đầu ra của một chương trình cho đầu vào của một chương trình khác. Tính năng này cũng được triển khai trong Windows và được hỗ trợ bởi .NET cũng như các thuộc tính ProcessStartInfo.RedirectStandardXxxx.

Tính năng tuyệt vời nhưng điều đó đã trở thành vấn đề khi hệ điều hành bắt đầu áp dụng Unicode. Windows NT là phiên bản đầu tiên hoàn toàn có mã Unicode. Các ký tự Unicode phải luôn được mã hóa, một sự lựa chọn chung sau đó là UCS, sau đó được biến thành utf-16. Bây giờ có một vấn đề với chuyển hướng I/O, một chương trình phát ra ký tự mã hóa 16 bit sẽ không hoạt động tốt khi nó được chuyển hướng đến một chương trình vẫn sử dụng các ký tự mã hóa 8 bit.

Tín dụng Ken Thompson cũng như tìm giải pháp cho vấn đề này, ông đã phát minh ra mã hóa utf-8.

Điều đó cũng hoạt động trong Windows. Dễ dàng để làm trong một ứng dụng chế độ giao diện điều khiển, bạn phải làm lại gán thuộc tính Console.OutputEncoding:

using System; 
using System.Text; 

class Program { 
    static void Main(string[] args) { 
     Console.OutputEncoding = Encoding.UTF8; 
     Console.WriteLine("Ĥėļŀō ŵŏŗłđ"); 
     Console.ReadLine(); 
    } 
} 

Bạn sẽ tại tuy nhiên gặp phải một vấn đề khác, phông chữ được lựa chọn cho các cửa sổ giao diện điều khiển có khả năng là không thể hiển thị văn bản. Nhấn Alt + Space để gọi trình đơn hệ thống, Thuộc tính, tab Phông chữ. Bạn sẽ cần phải chọn một phông chữ không raster. Chọn rất mỏng, trên Vista và bạn có thể chọn Consolas. Chạy lại chương trình của bạn và các ký tự có dấu trọng âm sẽ hiển thị chính xác. Rất tiếc, việc buộc phông chữ bảng điều khiển theo lập trình là một vấn đề, bạn cần phải ghi lại bước cấu hình này. Ngoài ra, một phông chữ như Consolas không có tập hợp đầy đủ các ký tự Unicode có thể có. Bạn có thể thấy các hình chữ nhật xuất hiện cho các điểm mã Unicode mà nó không có glyph. Tất cả một lời nhắc nhở không rõ ràng rằng việc tạo ra một chương trình GUI thực sự là cược tốt nhất của bạn.

+0

Cảm ơn LOT .... những kẻ tuyệt vời trên Stack Overflow .. –

+0

@Hans Passant Đây là một lời giải thích tuyệt vời! Cảm ơn bạn cho bài học lịch sử :) - một vấn đề duy nhất mà tôi có với việc tạo ra một chương trình GUI, là nó không cung cấp tất cả các khả năng mà Console làm như xa như làm việc với văn bản ... suy nghĩ về việc tạo ra Matrix Rain trong một ứng dụng WinForms ... nó gần như không thể vì bạn không thể đặt một đoạn văn bản ở đâu đó mà không sử dụng GDI +, và sau đó bạn gặp phải những rào cản khổng lồ như kiên trì và nhấp nháy ... v.v ... Tất cả những gì cần nói: vâng, Các chương trình GUI hoạt động ... phần lớn thời gian;) – MaxOvrdrv

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