Faktycznie, istnieje sposób, aby to zrobić ze standardowym writeln() wywołuje, ale to wiąże się łatanie błąd w RTL Delphi 2009. Chodzi o to, czy jakiś kompilator Delphi magia dla writeln. W przypadku argumentów UnicodeString powoduje to wywołanie _WriteUString. Metodę tę można zobaczyć w System.pas, chociaż nie można jej wywołać bezpośrednio. W nim zobaczysz wywołanie _WriteLString, ale ta metoda otrzymuje argument AnsiString. Więc kiedy to połączenie ma miejsce, twój UnicodeString jest downcasted do AnsiString.
Rozwiązaniem jest, aby to zmienić UnicodeString-> AnsiString wrzucony do UnicodeString-> UTF8String obsady.
Teraz, kiedy ustawić konsolę do UTF-8, wszystkie znaki przejdzie nietknięty (i tak, oczywiście trzeba czcionki ze wsparciem dla znaków, które chcesz pokazać):
SetConsoleOutputCP(CP_UTF8)
Dla tej poprawki RTL, będziesz musiał zrobić pewne sprytne podpięcie kodu. Zrobiłem to już i mój kolega zajęty jest pisaniem artykułu na ten temat. Opublikuję link, gdy będzie dostępny online.
Pozdrawiam!
Próbowałem twojego kodu. To nie działa. Czy przetestowałeś go pod kątem znaków Unicode w formacie innym niż ANSI (na przykład widechar (416 USD) - "Ж", widechar (11 USD) - "ğ", Widechar (633 USD) - "S")? –
Przepraszamy, zapomniałem o czcionce konsoli (uruchomiłem ją w trybie debugowania). Dzięki, działa z czcionką wektorową (zmieniłem czcionkę wektorową konsoli na "Courier New"). –
WriteConsole nie będzie działać dla przekierowanych danych wyjściowych (takich jak app.exe> plik.txt), więc lepiej sprawdź, czy WriteConsole zwraca False, a następnie użyj WriteFile. Za pomocą WriteFile możesz napisać unicode lub ansi. Zwykle większość aplikacji używa w tym przypadku ansi. – Alex