2008-11-05 41 views

Trả lời

9

Tôi không chắc chắn đó là những gì bạn đang theo dõi, nhưng bạn có thể tạo các ứng dụng bảng điều khiển Unicode trong tất cả các phiên bản Delphi 32 bit bằng cách sử dụng các chức năng của Windows API. Tôi chỉ cố gắng với Delphi 4:

program test; 

{$APPTYPE CONSOLE} 

uses 
    Windows; 

var 
    s: WideString; 
    i: integer; 
    Written: Cardinal; 
begin 
    SetLength(s, 80); 
    for i := 1 to 80 do 
    s[i] := WideChar(48 + i); 
    WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), PWideChar(s), 80, Written, 
    nil); 
end. 

Tôi không có Delphi năm 2009 để thử như thế nào vào chuỗi Unicode trong trình soạn thảo hoạt động ...

+0

Tôi đã thử mã của bạn. Nó không hoạt động. Bạn đã thử nghiệm nó cho các ký tự Unicode không ANSI (ví dụ: widechar ($ 416) - "Ж", widechar ($ 11f) - "ğ", widechar ($ 633) - "س")? –

+0

Xin lỗi, tôi quên mất về giao diện điều khiển phông chữ (tôi chạy nó trong chế độ gỡ lỗi). Cảm ơn, nó hoạt động với phông chữ vector (tôi đã thay đổi phông chữ vector của bảng điều khiển thành "Courier New"). –

+1

WriteConsole sẽ không hoạt động cho đầu ra được chuyển hướng (như app.exe> ​​file.txt), vì vậy bạn nên kiểm tra xem WriteConsole có trả về False hay không rồi sử dụng WriteFile thay thế. Với WriteFile bạn có thể viết unicode hoặc ansi. Hầu hết các ứng dụng sử dụng ansi trong trường hợp đó. – Alex

5

Bạn không thể (Ít nhất không phải với thư viện tiêu chuẩn). Các chức năng điều khiển được các chức năng Unicode không chỉ trong Delphi 2009.

+0

Nếu Delphi 2009 thực sự là full-unicode phải có một cách để làm điều đó. –

+0

Không, bảng điều khiển là phần duy nhất không phải là unicode. Tôi có thông tin đó trực tiếp từ một diễn giả codegear tại một hội nghị. –

+0

Cảm ơn thông tin này. –

0

diện điều khiển Windows không thể hiển thị charactes unicode, vì vậy hãy thử để gửi ra để nộp với:

my_app.exe > unicode_file.txt 

và thử xem unicode_file.txt với văn bản tốt biên tập viên.

+0

Bảng điều khiển cửa sổ có thể hiển thị các ký tự unicode. Có một số chương trình sử dụng giao diện điều khiển unicode. Chuyển hướng đầu ra vào một tập tin cho cùng một văn bản bị lỗi. –

1

@Kabrol: Với bộ phông chữ raster tôi không nhìn thấy một trong các ký tự, nhưng với Lucida Console tôi thấy ít nhất widechar ($ 11f) - "ğ".

Vui lòng xem "SetConsoleOutputCP Only Effective with Unicode Fonts" và nói chung mô tả về chức năng API bảng điều khiển tại "Console Reference".

+0

Xin lỗi, tôi quên mất về giao diện điều khiển phông chữ (tôi chạy nó trong chế độ gỡ lỗi). Cảm ơn, nó hoạt động với phông chữ vector (tôi đã thay đổi phông chữ vector của bảng điều khiển thành "Courier New"). –

10

Writeln in Delphi 2009 vẫn sử dụng ANSI (xem System TTextRec) nhưng bạn có thể sử dụng UTF8Encode và thay đổi trang đầu ra của bảng điều khiển thành UTF8 bằng cách gọi SetConsoleOutputCP (CP_UTF8). Bạn cũng sẽ cần một phông chữ tốt để thực sự hiển thị các ký tự Unicode.

+0

Không thể tin được! Cảm ơn, Nó hoạt động. Tôi không biết rằng giao diện điều khiển cửa sổ hỗ trợ bộ ký tự nhiều byte như UTF-8. –

0

Thực ra, có một cách để thực hiện điều này với các cuộc gọi WriteLn() chuẩn, nhưng nó liên quan đến việc vá lỗi trong RTL Delphi 2009. Vấn đề là, Delphi thực hiện một số phép thuật biên dịch cho WriteLn. Đối với các đối số UnicodeString, điều này dẫn đến một cuộc gọi đến _WriteUString. Phương thức đó có thể được nhìn thấy trong System.pas, mặc dù bạn không thể gọi nó trực tiếp. Trong đó bạn sẽ thấy một cuộc gọi đến _WriteLString, nhưng phương thức đó nhận được một đối số AnsiString. Vì vậy, khi cuộc gọi này đang diễn ra, UnicodeString của bạn đang được downcasted để AnsiString.

Giải pháp là, để thay đổi UnicodeString-> AnsiString này thành một diễn viên UnicodeString-> UTF8String.

Bây giờ, khi bạn thiết lập giao diện điều khiển để UTF8, tất cả các nhân vật của bạn sẽ đi qua hoang sơ (và có, ofcourse bạn sẽ cần một phông chữ với sự hỗ trợ cho các ký tự mà bạn muốn hiển thị):

SetConsoleOutputCP(CP_UTF8) 

Đối với bản sửa lỗi RTL này, bạn sẽ cần phải thực hiện một số mã hooking. Tôi đã làm điều này rồi, và một đồng nghiệp của tôi đang bận viết một bài báo về điều này. Tôi sẽ đăng một liên kết khi nó có sẵn trực tuyến.

Chúc mừng!

+0

Điều này nghe có vẻ như phát minh lại bánh xe vì đã có một bài báo có tựa như "Cuộc phiêu lưu của Homer": http://edn.embarcadero.com/article/39022 – mjn

+0

Có thể bạn không chú ý, nhưng đây chính là bài viết tôi muốn nói - người mà đồng nghiệp của tôi Marjan Venema viết (nếu bạn nhìn kỹ, tên của tôi _does_ xuất hiện ở đó một vài lần). Dù sao, cảm ơn bạn đã thêm liên kết - đôi khi tôi quên những điều đó. Và có, nó thay vì đọc như một cuộc phiêu lưu thực sự! – PatrickvL

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