在 Fuchsia 中使用 Unicode 的国际组件 (ICU)

Fuchsia 将 ICU 库用于常见的 共享的国际化服务,如日期、时间、时区、语言区域和 语言处理

ICU 库大致由两个不同的部分组成:ICU 库代码 (包含 ICU 算法)以及 ICU 库数据(包含 特定于语言区域的信息,打包后可单独重复使用。

添加 ICU 库依赖项

BUILD.gn 文件中添加必要的库依赖项:

C++

ICU 库是单个第三方依赖项,用作 ${icu_root}:icu

third_party_icu_headers("icu_headers") {
  headers = [
    "third_party/icu/source/common/unicode/locid.h",
    "third_party/icu/source/common/unicode/ucnv.h",
    "third_party/icu/source/common/unicode/unistr.h",
    "third_party/icu/source/i18n/unicode/calendar.h",
    "third_party/icu/source/i18n/unicode/gregocal.h",
    "third_party/icu/source/i18n/unicode/smpdtfmt.h",
    "third_party/icu/source/i18n/unicode/timezone.h",
    "third_party/icu/source/i18n/unicode/tzfmt.h",
  ]
}

source_set("lib") {
  sources = [
    "intl_wisdom_client.cc",
    "intl_wisdom_client.h",
  ]

  public_deps = [
    ":icu_headers",
    "//examples/intl/wisdom/fidl:wisdom_hlcpp",
    "//sdk/lib/fidl/hlcpp",
    "//sdk/lib/sys/cpp",
  ]
}

Rust

rust_icu 库细分为几个 crate,分别对应于 特定 ICU4C 标头:

deps += [
  "//third_party/rust_crates:rust_icu_sys",
  "//third_party/rust_crates:rust_icu_ucal",
  "//third_party/rust_crates:rust_icu_udat",
  "//third_party/rust_crates:rust_icu_uloc",
  "//third_party/rust_crates:rust_icu_ustring",
]
non_rust_deps = [ "//src/lib/icu:lib" ]

导入 ICU 标头

为您的程序所需的特定 ICU 库功能添加导入项:

C++

ICU 文档提供了 有关该库支持的 API 的信息。

#include "examples/intl/wisdom/cpp/client/icu_headers.h"

Rust

rust_icu 参考提供了 有关该库支持的 API 的信息。

use anyhow::Error;
use {
    fidl_fuchsia_examples_intl_wisdom as fwisdom, fidl_fuchsia_intl as fintl, rust_icu_sys as usys,
    rust_icu_ucal as ucal, rust_icu_udat as udat, rust_icu_uloc as uloc,
    rust_icu_ustring as ustring,
};

初始化 ICU 数据

在 Fuchsia 中,程序必须在运行时加载 ICU 数据。初始化 使用 icu_data 库处理 ICU 数据:

C++

ZX_ASSERT(icu_data::Initialize() == ZX_OK);

Rust

// Force the loading of ICU data at the beginning of the program.  Since
// Fuchsia's ICU does not have `libicudata.so`, we must load the data here
// so that locales could be used in the server.
let _loader = icu_data::Loader::new()?;

如需详细了解如何从各种来源加载 ICU 数据, 请参阅 ICU 时区数据

现在,您可以在 Fuchsia 程序中使用 ICU 库功能了。