Podsumowanie programowania Unicode
Aby korzystać z obsługi MFC i języka C w czasie wykonywania dla Unicode, musisz:
Zdefiniuj .
_UNICODE
Zdefiniuj symbol
_UNICODE
przed utworzeniem programu.Określ punkt wejścia.
Na stronie Zaawansowane folderu Konsolidator w oknie dialogowym Strony właściwości projektu ustaw symbol punktu wejścia na
wWinMainCRTStartup
wartość .Używaj przenośnych funkcji i typów czasu wykonywania.
Użyj odpowiednich funkcji czasu wykonywania języka C na potrzeby obsługi ciągów Unicode. Możesz użyć
wcs
rodziny funkcji, ale możesz preferować w pełni przenośne (włączone na arenie międzynarodowej)_TCHAR
makra. Wszystkie te makra są poprzedzone prefiksem_tcs
; zastępują jedną dlastr
jednej dla rodziny funkcji. Te funkcje zostały szczegółowo opisane w sekcji Internationalization (Internationalization) w dokumentacji biblioteki czasu wykonywania. Aby uzyskać więcej informacji, zobacz Ogólne mapowania tekstu w pliku tchar.h.Użyj
_TCHAR
i powiązanych przenośnych typów danych opisanych w temacie Obsługa formatu Unicode.Poprawnie obsłuż ciągi literału.
Kompilator języka Visual C++ interpretuje ciąg literału zakodowany jako:
L"this is a literal string"
oznaczać ciąg znaków Unicode. Można użyć tego samego prefiksu dla znaków literałów. Użyj makra
_T
, aby kodować ciągi literałów w sposób ogólny, więc kompilują się jako ciągi Unicode w formacie Unicode lub jako ciągi ANSI (w tym MBCS) bez formatu Unicode. Na przykład zamiast:pWnd->SetWindowText( "Hello" );
Użyj programu:
pWnd->SetWindowText( _T("Hello") );
Po
_UNICODE
zdefiniowaniu_T
ciąg literału tłumaczy ciąg literału na postać prefiksu L. W przeciwnym razie_T
tłumaczy ciąg bez prefiksu L.Napiwek
Makro
_T
jest identyczne z makrem_TEXT
.Zachowaj ostrożność podczas przekazywania długości ciągów do funkcji.
Niektóre funkcje chcą mieć liczbę znaków w ciągu; inne chcą liczby bajtów. Na przykład jeśli
_UNICODE
jest zdefiniowana, następujące wywołanieCArchive
obiektu nie będzie działać (str
jest ):CString
archive.Write( str, str.GetLength( ) ); // invalid
W aplikacji Unicode długość daje liczbę znaków, ale nie poprawną liczbę bajtów, ponieważ każdy znak ma 2 bajty szerokości. Zamiast tego należy użyć:
archive.Write( str, str.GetLength( ) * sizeof( _TCHAR ) ); // valid
określa prawidłową liczbę bajtów do zapisu.
Jednak funkcje składowe MFC, które są zorientowane na znaki, a nie zorientowane na bajty, działają bez tego dodatkowego kodowania:
pDC->TextOut( str, str.GetLength( ) );
CDC::TextOut
przyjmuje liczbę znaków, a nie liczbę bajtów.Użyj fopen_s, _wfopen_s , aby otworzyć pliki Unicode.
Podsumowując, MFC i biblioteka czasu wykonywania zapewniają następującą obsługę programowania Unicode:
Z wyjątkiem funkcji składowych klasy bazy danych wszystkie funkcje MFC są włączone w formacie Unicode, w tym
CString
.CString
Udostępnia również funkcje konwersji Unicode/ANSI.Biblioteka czasu wykonywania dostarcza wersje Unicode wszystkich funkcji obsługi ciągów. (Biblioteka czasu wykonywania dostarcza również przenośne wersje odpowiednie dla unicode lub MBCS.
_tcs
Są to makra).tchar.h dostarcza przenośne typy danych i
_T
makro do tłumaczenia ciągów literału i znaków. Aby uzyskać więcej informacji, zobacz Ogólne mapowania tekstu w pliku tchar.h.Biblioteka środowiska uruchomieniowego udostępnia szeroką wersję programu
main
. Użyjwmain
polecenia , aby aplikacja korzystała z formatu Unicode.