Obsługa formatu Unicode
Unicode to specyfikacja obsługująca wszystkie zestawy znaków, w tym te, które nie mogą być reprezentowane w jednym bajtzie. Jeśli programujesz na rynku międzynarodowym, zalecamy użycie formatu Unicode lub zestawu znaków wielobajtowych (MBCS). Możesz też zaprogramować program, aby można go było skompilować, zmieniając przełącznik.
Szeroki znak jest dwubajtowym kodem wielojęzycznym. Dziesiątki tysięcy znaków składających się z prawie wszystkich znaków używanych we współczesnym przetwarzaniu na całym świecie, w tym symboli technicznych i znaków publikacji specjalnych, można przedstawić zgodnie ze specyfikacją Unicode jako pojedynczy szeroki znak zakodowany przy użyciu utF-16. Znaki, których nie można przedstawić tylko w jednym szerokim znaku, mogą być reprezentowane w parze Unicode przy użyciu funkcji pary zastępczej Unicode. Ponieważ prawie każdy znak we wspólnym użyciu jest reprezentowany w formacie UTF-16 w jednym 16-bitowym znaku, użycie znaków szerokich upraszcza programowanie w międzynarodowych zestawach znaków. Znaki szerokie zakodowane przy użyciu formatu UTF-16LE (dla języka little-endian) są natywnym formatem znaków dla systemu Windows.
Ciąg wieloznaczny jest reprezentowany jako tablica wchar_t[]
i jest wskazywany przez wchar_t*
wskaźnik. Każdy znak ASCII może być reprezentowany jako znak szeroki przez prefiks litery L do znaku. Na przykład L'\0 jest znakiem NULL o szerokości zakończenia (16-bitowej). Podobnie każdy literał ciągu ASCII może być reprezentowany jako literał ciągu szerokiego znaku, prefiksując literę L do literału ASCII (L"Hello").
Ogólnie rzecz biorąc, znaki szerokie zajmują więcej miejsca w pamięci niż znaki wielobajtowe, ale są szybsze do przetworzenia. Ponadto tylko jedno ustawienia regionalne mogą być reprezentowane w czasie w kodowaniu wielobajtowym, natomiast wszystkie zestawy znaków na świecie są reprezentowane jednocześnie przez reprezentację Unicode.
Struktura MFC jest włączona w formacie Unicode w całym środowisku, a MFC umożliwia włączenie unicode przy użyciu makr przenośnych, jak pokazano w poniższej tabeli.
Przenośne typy danych w MFC
Typ danych nieodnośnych | Zastąpione przez to makro |
---|---|
char , wchar_t |
_TCHAR |
char* , LPSTR (typ danych Win32), LPWSTR |
LPTSTR |
const char* , LPCSTR (typ danych Win32), LPCWSTR |
LPCTSTR |
Klasa CString
używa _TCHAR
jako podstawy i udostępnia konstruktory i operatory do łatwej konwersji. Większość operacji ciągów dla unicode można napisać przy użyciu tej samej logiki używanej do obsługi zestawu znaków ANSI systemu Windows, z tą różnicą, że podstawowa jednostka operacji jest znakiem 16-bitowym zamiast 8-bitowego bajtu. W przeciwieństwie do pracy z zestawami znaków wielobajtowych, nie trzeba traktować znaku Unicode tak, jakby były to dwa odrębne bajty. Musisz jednak radzić sobie z możliwością pojedynczego znaku reprezentowanego przez zastępczą parę znaków szerokich. Ogólnie rzecz biorąc, nie należy pisać kodu, który zakłada, że długość ciągu jest taka sama jak liczba znaków, zarówno wąskich, jak i szerokich, które zawiera.
Co chcesz zrobić?
Korzystanie z obsługi MFC Unicode i zestawu znaków wielobajtowych (MBCS)
Włączanie zarówno formatu Unicode, jak i MBCS w moim programie
Tworzenie programu z internacjonalizowanego przy użyciu formatu Unicode
Użyj wmain, abym mógł przekazać argumenty o szerokim znaku do mojego programu
Dowiedz się więcej o mapowaniach tekstu ogólnego na potrzeby przenoszenia bajtów szerokości