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!
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) - "س")? –
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"). –
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