Bagikan melalui


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 UNICODEpraprosesor , yang lain menggunakan _UNICODE dengan awalan garis bawah. Selalu tentukan kedua simbol. Visual C++ mengatur keduanya secara default saat Anda membuat proyek baru.

Berikutnya

Apa itu Jendela?