Komponen Internasional untuk Unicode (ICU)

International Components for Unicode (ICU) adalah sekumpulan API globalisasi sumber terbuka yang matang dan banyak digunakan. ICU menggunakan Common Locale Data Repository (CLDR) Unicode yang luas sebagai pustaka datanya, memberikan dukungan globalisasi untuk aplikasi perangkat lunak. ICU sangat portabel dan memberi aplikasi hasil yang sama di semua platform.

Sorotan layanan API Globalisasi yang disediakan oleh ICU

  • Konversi Halaman Kode: Mengonversi data teks ke atau dari Unicode dan hampir semua set karakter atau pengodean lainnya. Tabel konversi ICU didasarkan pada data charset yang dikumpulkan oleh IBM selama beberapa dekade, dan merupakan yang paling lengkap tersedia di mana saja.
  • Kolabasi: Bandingkan string sesuai dengan konvensi dan standar bahasa, wilayah, atau negara tertentu. Kolase ICU didasarkan pada Algoritma Kolase Unicode ditambah aturan perbandingan khusus lokal dari CLDR.
  • Pemformatan: Memformat angka, tanggal, waktu, dan jumlah mata uang sesuai dengan konvensi lokal yang dipilih. Ini termasuk menerjemahkan nama bulan dan hari ke dalam bahasa yang dipilih, memilih singkatan yang sesuai, mengurutkan bidang dengan benar, dll. Data ini juga berasal dari Repositori Data Lokal Umum.
  • Perhitungan Waktu: Beberapa jenis kalender disediakan di luar Gregorian tradisional. Serangkaian API penghitungan zona waktu yang menyeluruh disediakan.
  • Dukungan Unicode: ICU melacak standar Unicode dengan cermat, menyediakan akses mudah ke semua properti karakter Unicode, Normalisasi Unicode, Lipatan Kasus, dan operasi dasar lainnya seperti yang ditentukan oleh Standar Unicode.
  • Ekspresi Reguler: Ekspresi reguler ICU sepenuhnya mendukung Unicode sambil memberikan performa yang sangat kompetitif.
  • Bidi: Dukungan untuk menangani teks yang berisi campuran data kiri ke kanan (Inggris) dan kanan ke kiri (Arab atau Ibrani).

Untuk informasi lebih lanjut, Anda dapat mengunjungi situs web ICU: http://site.icu-project.org/

Gambaran Umum

Dalam Windows 10 Creators Update, ICU diintegrasikan ke dalam Windows, membuat API C dan data dapat diakses publik.

Penting

Versi ICU di Windows hanya mengekspos API C. Ini tidak mengekspos api C++ apa pun. Sayangnya, tidak mungkin untuk pernah mengekspos API C++ karena kurangnya ABI yang stabil di C++.

Untuk dokumentasi tentang API C ICU, silakan lihat halaman dokumentasi ICU resmi di sini: http://icu-project.org/apiref/icu4c/index.html#Module

Riwayat perubahan pada pustaka ICU di Windows

Versi 1703 (Pembaruan Pembuat)

Pustaka ICU pertama kali ditambahkan ke OS Windows 10 dalam versi ini. Ini ditambahkan sebagai:

  • Dua DLL sistem:
    • icuuc.dll (ini adalah pustaka "umum" ICU)
    • icuin.dll (ini adalah pustaka "i18n" ICU)
  • Dua file header di SDK Windows 10:
    • icucommon.h
    • icui18n.h
  • Dua pustaka impor di SDK Windows 10:
    • icuuc.lib
    • icuin.lib

Versi 1709 (Pembaruan Fall Creators)

File header gabungan, icu.h, ditambahkan, yang berisi konten kedua file header di atas (icucommon.h dan icui18n.h), dan juga mengubah jenis UCHAR menjadi char16_t.

Versi 1903 (Pembaruan Mei 2019)

DLL gabungan baru, icu.dll, ditambahkan, yang berisi pustaka "umum" dan "i18n". Selain itu, pustaka impor baru ditambahkan ke Windows 10 SDK: icu.lib.

Ke depannya, tidak ada API baru yang akan ditambahkan ke header lama (icucommon.h dan icui18n.h) atau ke libs impor lama (icuuc.lib dan icuin.lib). API baru hanya akan ditambahkan ke header gabungan (icu.h) dan lib impor gabungan (icu.lib).

Memulai

Ada tiga langkah utama yang harus diikuti: (Windows 10 Creators Update atau lebih tinggi)

  1. Aplikasi Anda perlu menargetkan Windows 10 Versi 1703 (Pembaruan Pembuat) atau yang lebih tinggi.

  2. Tambahkan di header:

    #include <icucommon.h>
    #include <icui18n.h>
    

    Pada Windows 10 Versi 1709 ke atas, Anda harus menyertakan header gabungan sebagai gantinya:

    #include <icu.h>
    
  3. Tautkan ke dua pustaka:

    • icuuc.lib
    • icuin.lib

    Pada Windows 10 Versi 1903 ke atas, Anda harus menggunakan pustaka gabungan sebagai gantinya:

    • icu.lib

Kemudian, Anda dapat memanggil ICU C API apa pun dari pustaka ini yang Anda inginkan. (Tidak ada API C++ yang terekspos.)

Penting

Jika Anda menggunakan pustaka impor warisan, icuuc.lib dan icuin.lib, pastikan pustaka tersebut tercantum sebelum pustaka payung, seperti onecoreuap.lib atau WindowsApp.lib, di pengaturan Penghubung Dependensi Tambahan (lihat gambar di bawah). Jika tidak, linker akan ditautkan ke icu.lib, yang akan menghasilkan upaya untuk memuat icu.dll selama durasi. DLL tersebut hanya ada dimulai dengan versi 1903. Jadi, jika pengguna meningkatkan SDK Windows 10 pada komputer Windows pra-versi 1903, aplikasi akan gagal dimuat dan dijalankan. Untuk riwayat pustaka ICU di Windows, lihat Riwayat perubahan pada pustaka ICU di Windows.

contoh icu

Catatan

  • Ini adalah konfigurasi untuk "Semua Platform".
  • Agar aplikasi Win32 menggunakan ICU, mereka perlu memanggil CoInitializeEx terlebih dahulu. Pada Windows 10 versi 1903 ke atas, di mana pustaka ICU gabungan (icu.dll/icu.lib) tersedia, Anda dapat menghilangkan panggilan CoInitializeEx dengan menggunakan pustaka gabungan.
  • Tidak semua data yang dikembalikan oleh API ICU akan selaras dengan OS Windows, karena pekerjaan penyelarasan ini masih berlangsung. 

Contoh Aplikasi ICU

Contoh cuplikan kode

Berikut ini adalah contoh yang mengilustrasikan penggunaan API ICU dari dalam aplikasi UWP C++. (Ini tidak dimaksudkan untuk menjadi aplikasi mandiri penuh, melainkan hanya contoh memanggil metode ICU.)

Contoh kecil berikut mengasumsikan bahwa ada metode ErrorMessage dan OutputMessage yang menghasilkan string kepada pengguna dengan cara tertentu.

// On Windows 10 Creators Update, include the following two headers. With Windows 10 Fall Creators Update and later, you can just include the single header <icu.h>.
#include <icucommon.h>
#include <icui18n.h>

void FormatDateTimeICU()
{
    UErrorCode status = U_ZERO_ERROR;

    // Create a ICU date formatter, using only the 'short date' style format.
    UDateFormat* dateFormatter = udat_open(UDAT_NONE, UDAT_SHORT, nullptr, nullptr, -1, nullptr, 0, &status);

    if (U_FAILURE(status))
    {
        ErrorMessage(L"Failed to create date formatter.");
        return;
    }

    // Get the current date and time.
    UDate currentDateTime = ucal_getNow();

    int32_t stringSize = 0;
    
    // Determine how large the formatted string from ICU would be.
    stringSize = udat_format(dateFormatter, currentDateTime, nullptr, 0, nullptr, &status);

    if (status == U_BUFFER_OVERFLOW_ERROR)
    {
        status = U_ZERO_ERROR;
        // Allocate space for the formatted string.
        auto dateString = std::make_unique<UChar[]>(stringSize + 1);

        // Format the date time into the string.
        udat_format(dateFormatter, currentDateTime, dateString.get(), stringSize + 1, nullptr, &status);

        if (U_FAILURE(status))
        {
            ErrorMessage(L"Failed to format the date time.");
            return;
        }

        // Output the formatted date time.
        OutputMessage(dateString.get());
    }
    else
    {
        ErrorMessage(L"An error occured while trying to determine the size of the formatted date time.");
        return;
    }

    // We need to close the ICU date formatter.
    udat_close(dateFormatter);
}