Bagikan melalui


Menggunakan Fungsi yang Tidak Memiliki Ekuivalen Unicode

Fungsi yang belum diimplementasikan dengan versi Unicode biasanya telah digantikan oleh fungsi yang lebih kuat atau diperluas yang mendukung Unicode. Misalnya, jika Anda memindah kode yang memanggil fungsi OpenFile , aplikasi Anda dapat mendukung Unicode dengan menggunakan fungsi CreateFile sebagai gantinya.

Jika fungsi tidak memiliki Unicode yang setara, aplikasi dapat memetakan karakter ke dan dari set karakter 8-bit sebelum dan sesudah panggilan fungsi. Misalnya, fungsi pemformatan angka atoi dan itoa hanya menggunakan digit 0 hingga 9. Biasanya, pemetaan Unicode ke karakter 8-bit menyebabkan hilangnya data, tetapi ini dapat dihindari dengan membuat kode tipe independen dan membuat ekspresi bersyariah. Pernyataan dalam contoh berikut, yang ditulis untuk karakter 8-bit, bergantung pada jenis dan harus diubah untuk mendukung Unicode.

char str[4] = "137";

int num = atoi(str);

Pernyataan ini dapat ditulis ulang sebagai berikut untuk membuatnya berjenis independen.

TCHAR tstr[4] = TEXT("137");

#ifdef UNICODE
size_t cCharsConverted;
CHAR strTmp[SIZE]; // SIZE equals (2*(sizeof(tstr)+1)). This ensures enough
                   // room for the multibyte characters if they are two 
                   // bytes long and a terminating null character. See Security 
                   // Alert below. 

wcstombs_s(&cCharsConverted, strTmp, sizeof(strTmp), (const wchar_t *)tstr, sizeof(strTmp));
num = atoi(strTmp);

#else

int num = atoi(tstr);

#endif 

Dalam contoh ini, fungsi pustaka C standar wcstombs menerjemahkan Unicode ke ASCII. Contohnya bergantung pada fakta bahwa digit 0 hingga 9 selalu dapat diterjemahkan dari Unicode ke ASCII, bahkan jika beberapa teks di sekitarnya tidak dapat. Fungsi atoi berhenti pada karakter apa pun yang bukan digit.

Aplikasi Anda dapat menggunakan fungsi National Language Support (NLS) LCMapString untuk memproses teks yang menyertakan digit asli yang disediakan untuk beberapa skrip di Unicode.

Perhatian

Menggunakan fungsi wcstombs salah dapat membahayakan keamanan aplikasi Anda. Pastikan bahwa buffer aplikasi untuk string karakter 8-bit setidaknya berukuran 2*(char_length +1), di mana char_length mewakili panjang string Unicode. Pembatasan ini dilakukan karena, dengan kumpulan karakter byte ganda (DBCSs), setiap karakter Unicode dapat dipetakan ke dua karakter 8-bit berturut-turut. Jika buffer tidak menahan seluruh string, string hasil tidak dihentikan null, menimbulkan risiko keamanan. Untuk informasi selengkapnya tentang keamanan aplikasi, lihat Pertimbangan Keamanan: Fitur Internasional.

 

Menggunakan Unicode dan Set Karakter