Open3

C++ ICUメモ

kale_corekale_core

Windowsでビルドは手間がかかるため、
ビルド済みライブラリと本家Visual Studio Community 2019 MSVCを利用
icu4c-74_2-Win64-MSVC2019.zipをダウンロード

https://github.com/unicode-org/icu/releases/tag/release-74-2

一方IDEとしては、本家ではなく、VS CodeとCMakeを使う
CMakeLists.txtは以下

set(ICU_PREBUID_DIR ${PROJECT_SOURCE_DIR}/icu4c-74_2-Win64-MSVC2019)
set(ICU_INCLUDE_DIR ${ICU_PREBUID_DIR}/include)
set(ICU_LIBRALY_DIR ${ICU_PREBUID_DIR}/lib64)
set(PREBUILT_LIBRARY ${ICU_LIBRALY_DIR}/icuuc.lib ${ICU_LIBRALY_DIR}/icuio.lib)
kale_corekale_core

間違えたポイント

文字列リテラルにはu8 プレフィックスを付ける

auto sentence = icu::UnicodeString::fromUTF8(
        u8"京都大学で自然言語処理を[MASK][MASK]する。");

u8 プレフィックスを指定しない場合は、実装定義のマルチバイト文字コードにエンコードされる。その実装定義の文字コードは、ASCII文字コードと互換があることは保証されない。そのため、UTF-8のASCII互換部分が、実装定義の文字コードと互換があることも、保証されない。

参考
https://cpprefjp.github.io/lang/cpp11/utf8_string_literals.html

std::stringを渡さない、c_str()する

なぜかfromUTF8にわたせてしまう
mapがsize=1から増えないという事態が発生した

std::map<icu::UnicodeString, int32_t> load_vocab(std::string vocab_file)
{
    std::map<icu::UnicodeString, int32_t> vocab;
    std::ifstream ifs(vocab_file);
    if (!ifs) {
        throw std::runtime_error("Not found");
    }
    std::string line;
    int32_t index = 0;
    while (std::getline(ifs, line, '\n')) {
        auto key = icu::UnicodeString::fromUTF8(line.c_str());
        vocab[key] = index;
        index++;
    }
    return vocab;
}