次の方法で共有


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のウェブサイトを参照してください: 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" ライブラリの両方を含む新しい結合 DLL icu.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. アプリケーションは、Windows 10 バージョン 1703 (Creators Update) 以降を対象とする必要があります。

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

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

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

    #include <icu.h>
    
  3. 2 つのライブラリへのリンク:

    • icuuc.lib
    • icuin.lib

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

    • 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 呼び出す必要があります。 組み合わされた ICU ライブラリ (icu.dll/icu.lib) を使用できる Windows 10 バージョン 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);
}