2008-11-05 4 views

Odpowiedz

9

nie jestem pewien, że to Ty jesteś po, ale można tworzyć aplikacje konsoli Unicode we wszystkich 32-bitowych wersjach Delphi za pomocą funkcji Windows API. Próbowałem tylko z 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. 

nie mam Delphi 2009, aby spróbować jak wprowadzanie ciągów Unicode w działa redaktor ...

+0

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

+0

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

+1

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

5

Nie można (przynajmniej nie z biblioteki standardowej). Funkcje konsoli są jedynymi non funkcje Unicode w Delphi 2009.

+0

Jeśli Delphi 2009 jest naprawdę full-unicode tam musi być jakiś sposób, aby to zrobić. –

+0

Nie, konsola to jedyna część, a nie unicode. Mam te informacje bezpośrednio od mówcy ds. Kodeków na konferencji. –

+0

Dzięki za te informacje. –

0

konsoli Windows nie może wyświetlić unicode Charactes, więc spróbuj wysłać dane wyjściowe do pliku z:

my_app.exe > unicode_file.txt 

i spróbuj przeglądania unicode_file.txt z dobrym tekstem redaktor.

+0

Konsola okna może wyświetlać znaki Unicode. Istnieje kilka programów korzystających z konsoli Unicode. Przekierowanie danych wyjściowych do pliku daje ten sam uszkodzony tekst ansi. –

1

@Kabrol: Z zestawu czcionek rastrowych nie wiem zobacz dowolny z znaków, ale z Lucida Console widzę przynajmniej widechar (11 funtów) - "ğ".

Zobacz opis funkcji interfejsu API konsoli pod numerem "SetConsoleOutputCP Only Effective with Unicode Fonts" pod adresem "Console Reference".

+0

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

10

Writeln w Delphi 2009 nadal używa ANSI (zobacz System TTextRec), ale możesz użyć UTF8Encode i zmienić wyjściową stronę kodową konsoli na UTF8, wywołując SetConsoleOutputCP (CP_UTF8). Będziesz potrzebował dobrej czcionki, aby wyświetlać znaki Unicode.

+0

Niewiarygodne! Dzięki, działa. Nie wiedziałem, że konsola Windows obsługuje wielobajtowy zestaw znaków, taki jak UTF-8. –

0

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!

+0

To brzmi jak ponowne wymyślenie koła, ponieważ istnieje już artykuł, który brzmi jak "Odyseja Homera": http://edn.embarcadero.com/article/39022 – mjn

+0

Może nie zauważyłeś, ale to jest dokładnie ten artykuł, który miałem na myśli - ten, który napisał mój kolega Marjan Venema (jeśli się przyjrzysz, moje nazwisko pojawi się tam kilka razy). W każdym razie, dzięki za dodanie linku - czasami zapominam o tych rzeczach. I tak, to raczej brzmi jak prawdziwa odyseja! – PatrickvL