International Components for Unicode (ICU)

International Components for Unicode (ICU) は、オープンソースのグローバリゼーション API の成熟した広く使用されているセットです。 ICU は Unicode の膨大な共通ロケール データ リポジトリ (CLDR) をデータ ライブラリとして利用し、ソフトウェア アプリケーションのグローバリゼーション サポートを提供します。 ICU は広く移植可能であり、すべてのプラットフォームでアプリケーションに同じ結果を提供します。

ICU が提供するグローバリゼーション API サービスのハイライト

  • コード ページ変換: テキスト データを Unicode とその他のほぼすべての文字セットまたはエンコードとの間で変換します。 ICU の変換テーブルは、何十年もの間に IBM によって収集された文字セット データに基づいており、どこでも使用できる最も完全なテーブルです。
  • 照合順序: 特定の言語、地域、または国の規則と標準に従って文字列を比較します。 ICU の照合順序は、Unicode 照合順序アルゴリズムと CLDR のロケール固有の比較規則に基づいています。
  • 書式設定: 選択したロケールの規則に従って、数値、日付、時刻、通貨の金額を書式設定します。 これには、月と日の名前を選択した言語に変換すること、適切な省略形の選択、フィールドの正しい順序付けなどが含まれます。このデータは、共通ロケール データ リポジトリからも取得されます。
  • 時間計算: 従来のグレゴリオ暦を超えて、複数の種類のカレンダーが提供されます。 タイム ゾーン計算 API の完全なセットが用意されています。
  • Unicode のサポート: ICU は Unicode 標準を厳密に追跡し、Unicode 標準で指定されている多くの Unicode 文字プロパティ、Unicode 正規化、大文字と小文字の折りたたみ、その他の基本的な操作すべてに簡単にアクセスできます。
  • 正規表現: ICU の正規表現は、非常に競争力のあるパフォーマンスを提供しながら、Unicode を完全にサポートします。
  • Bidi: 左から右 (英語) と右から左 (アラビア語またはヘブライ語) のデータの組み合わせを含むテキストの処理をサポートします。

詳細については、ICU Web サイトを参照してください。 http://site.icu-project.org/

概要

Windows 10 Creators Updateでは、ICU が Windows に統合され、C API とデータにパブリックにアクセスできるようになります。

重要

Windows の ICU のバージョンでは、C API のみが公開されます。 C++ API は公開されません。 残念ながら、C++ では安定した ABI がないため、C++ API を公開することは不可能です。

ICU C API のドキュメントについては、こちらの公式 ICU ドキュメント ページを参照してください。 http://icu-project.org/apiref/icu4c/index.html#Module

Windows の ICU ライブラリの変更履歴

バージョン 1703 (Creators Update)

ICU ライブラリは、このバージョンの Windows 10 OS に最初に追加されました。 次のように追加されました。

  • 2 つのシステム DLL:
    • icuuc.dll (これは ICU の "共通" ライブラリです)
    • icuin.dll (これは ICU "i18n" ライブラリです)
  • Windows 10 SDK の 2 つのヘッダー ファイル:
    • icucommon.h
    • icui18n.h
  • Windows 10 SDK の 2 つのインポート ライブラリ:
    • icuuc.lib
    • icuin.lib

バージョン 1709 (Fall Creators Update)

上記の両方のヘッダー ファイル ( icucommon.h と icui18n.h) の内容を含む、結合されたヘッダー ファイル icu.h が追加され、 の UCHAR 型も に char16_t変更されました。

バージョン 1903 (2019 年 5 月の更新プログラム)

"共通" ライブラリと "i18n" ライブラリの両方を含む、新しい組み合わせ DLLicu.dllが追加されました。 また、新しいインポート ライブラリが Windows 10 SDK: icu.lib に追加されました。

今後、古いヘッダー (icucommon.h と icui18n.h) や古いインポート ライブラリ (icuuc.lib と icuin.lib) には、新しい API は追加されません。 新しい API は、結合されたヘッダー (icu.h) と結合されたインポート ライブラリ (icu.lib) にのみ追加されます。

作業の開始

次の 3 つのメイン手順があります(Windows 10 Creators Update以降)

  1. アプリケーションは、バージョン 1703 (Creators Update) 以降Windows 10ターゲットにする必要があります。

  2. ヘッダーに を追加します。

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

    バージョン 1709 以降Windows 10では、代わりに結合ヘッダーを含める必要があります。

    #include <icu.h>
    
  3. 次の 2 つのライブラリにリンクします。

    • icuuc.lib
    • icuin.lib

    バージョン 1903 以降Windows 10では、代わりに組み合わされたライブラリを使用する必要があります。

    • icu.lib

その後、これらのライブラリから任意の ICU C API を呼び出すことができます。 (C++ API は公開されません)。

重要

従来のインポート ライブラリである icuuc.lib と icuin.lib を使用している場合は、onecoreuap.lib や WindowsApp.lib などのアンブレラ ライブラリの前にある [追加の依存関係リンカー] 設定にそれらのライブラリが一覧表示されていることを確認します (下の図を参照)。 それ以外の場合、リンカーは icu.lib にリンクするため、実行時にicu.dllを読み込もうとします。 その DLL は、バージョン 1903 以降でのみ存在します。 そのため、ユーザーがバージョン 1903 より前の Windows マシンで Windows 10 SDK をアップグレードすると、アプリの読み込みと実行に失敗します。 Windows の ICU ライブラリの履歴については、「Windows の ICU ライブラリの変更履歴」を参照してください。

icu の例

注意

  • これは、"すべてのプラットフォーム" の構成です。
  • Win32 アプリで ICU を使用するには、まず CoInitializeEx を呼び出す必要があります。 結合 Windows 10された ICU ライブラリ (icu.dll/icu.lib) が使用可能なバージョン 1903 以降では、結合されたライブラリを使用して CoInitializeEx 呼び出しを省略できます。
  • ICU API によって返されるすべてのデータが Windows OS と一致するとは限りません。このアラインメント作業はまだ進行中です。 

ICU サンプル アプリ

コード スニペットの例

C++ UWP アプリケーション内からの ICU API の使用を示す例を次に示します。 (完全なスタンドアロン アプリケーションではなく、ICU メソッドを呼び出す単なる例です)。

次の小さな例では、何らかの方法で文字列をユーザーに出力する ErrorMessage メソッドと OutputMessage メソッドがあることを前提としています。

// 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);
}