Bekerja dengan String
Topik ini menjelaskan bagaimana Windows mendukung string Unicode untuk elemen UI, nama file, dan sebagainya (Unicode adalah pengodean karakter pilihan karena mendukung semua set karakter dan bahasa).
Windows mewakili karakter Unicode menggunakan pengodean UTF-16, di mana setiap karakter dikodekan sebagai satu atau dua nilai 16-bit. Untuk membedakannya dari karakter ANSI 8-bit, karakter UTF-16 disebut karakter lebar . Pengkompilasi Visual C++ mendukung jenis data bawaan wchar_t untuk karakter lebar. File header WinNT.h juga menentukan typedef berikut.
typedef wchar_t WCHAR;
Untuk mendeklarasikan literal karakter lebar atau string karakter lebar harfiah, letakkan L sebelum literal.
wchar_t a = L'a';
wchar_t *str = L"hello";
Tabel berikut ini mencantumkan beberapa typedef terkait string lainnya:
Typedef | Definisi |
---|---|
CHAR | char |
PSTR atau LPSTR | char* |
PCSTR atau LPCSTR | const char* |
PWSTR atau LPWSTR | wchar_t* |
PCWSTR atau LPCWSTR | const wchar_t* |
Fungsi Unicode dan ANSI
Ketika Microsoft memperkenalkan dukungan Unicode ke Windows, microsoft meringankan transisi dengan menyediakan dua set API paralel, satu untuk string ANSI dan yang lainnya untuk string Unicode. Misalnya, ada dua fungsi untuk mengatur teks bilah judul jendela:
- SetWindowTextA mengambil string ANSI.
- SetWindowTextW mengambil string Unicode.
Secara internal, versi ANSI menerjemahkan string ke Unicode. Header Windows juga menentukan makro yang diselesaikan ke versi Unicode ketika simbol UNICODE
prapemroses ditentukan atau versi ANSI sebaliknya.
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
Fungsi ini didokumenkan dengan nama SetWindowText, meskipun itu benar-benar nama makro, bukan nama fungsi aktual.
Aplikasi baru harus selalu memanggil versi Unicode. Banyak bahasa dunia membutuhkan Unicode. Jika Anda menggunakan string ANSI, tidak mungkin untuk melokalisasi aplikasi Anda. Versi ANSI juga kurang efisien, karena sistem operasi harus mengonversi string ANSI ke Unicode pada waktu proses. Bergantung pada preferensi Anda, Anda dapat memanggil fungsi Unicode secara eksplisit, seperti SetWindowTextW, atau menggunakan makro. API Windows terbaru biasanya hanya memiliki versi Unicode.
TCHAR
Dalam beberapa kasus, mungkin berguna untuk mengkompilasi kode yang sama untuk string ANSI atau Unicode, tergantung pada platform target. Untuk tujuan ini, Windows SDK menyediakan makro yang memetakan string ke Unicode atau ANSI, tergantung pada platform.
Makro | Unicode | ANSI |
---|---|---|
TCHAR | wchar_t |
char |
TEXT("x") atau _T("x") |
L"x" |
"x" |
Misalnya, kode berikut:
SetWindowText(TEXT("My Application"));
menyelesaikan salah satu hal berikut:
SetWindowTextW(L"My Application"); // Unicode function with wide-character string.
SetWindowTextA("My Application"); // ANSI function.
Makro TEXT dan TCHAR kurang berguna saat ini, karena semua aplikasi harus menggunakan Unicode.
Header untuk pustaka run-time Microsoft C menentukan sekumpulan makro yang sama. Misalnya, _tcslen memutuskan untuk strlen jika _UNICODE
tidak terdefinisi; jika tidak, itu diselesaikan ke wcslen, yang merupakan versi karakter luas dari strlen.
#ifdef _UNICODE
#define _tcslen wcslen
#else
#define _tcslen strlen
#endif
Hati-hati: Beberapa header menggunakan simbol UNICODE
praprosesor , yang lain menggunakan _UNICODE
dengan awalan garis bawah. Selalu tentukan kedua simbol. Visual C++ mengatur keduanya secara default saat Anda membuat proyek baru.