スポンサーリンク

ICUライブラリで一文字replace

// char16のindexとその文字を構成するchar16の個数のリスト作成
std::vector<std::pair<int32_t, int32_t>> getIndexList(const icu::UnicodeString& s) {

  std::vector<std::pair<int32_t, int32_t>> c_c;

  UErrorCode err;
  icu::BreakIterator* bi = icu::BreakIterator::createCharacterInstance(
    icu::Locale::getDefault(), err);
  bi->setText(s);

  int32_t current = bi->first();
  while (current != icu::BreakIterator::DONE) {

    int32_t prev = current;
    current = bi->next();

    if (current == UBRK_DONE) break;

    c_c.emplace_back(prev, current - prev );

  }

  return c_c;
}
void WinPaint(HWND hWnd) {

  // 元の文字列の定義
  std::u16string u16s = u"aあغ山👨‍👧經经";

  ////////////////////////////////////////
  ////////////////////////////////////////

  icu::UnicodeString usr(u16s.c_str());

  // char16のindexとその文字を構成するchar16の個数のリスト作成
  std::vector<std::pair<int32_t, int32_t>> ilis = getIndexList(usr);

  // 文字の置き換え
  icu::UnicodeString B("B");
  // 4文字目を「B」に書き換える
  // UnicodeString::replace(先頭index,置換前の要素数,置換後の文字)
  usr.replace(ilis[4].first, ilis[4].second, B);


  ////////////////////////////////////////
  ////////////////////////////////////////

  ////////////////////////////
  //フォトの設定
  HDC hdc;
  PAINTSTRUCT ps;
  hdc = BeginPaint(hWnd, &ps);
  SetTextColor(hdc, RGB(0, 0, 0));  //文字の色を設定
  SetBkColor(hdc, RGB(230, 230, 230));  //文字の背景色を設定
  HFONT backup = (HFONT)SelectObject(hdc, hFont1);  //Step2  フォントを適応
  TEXTMETRIC tm;
  GetTextMetrics(hdc, &tm);
  int TH = 10;

  ////////////////////////////
  //文字を一文字(書記素)ずつ表示

  UErrorCode err;
  icu::BreakIterator* bi = icu::BreakIterator::createCharacterInstance(
    icu::Locale::getDefault(), err);
  bi->setText(usr);

  int32_t current = bi->first();
  while (current != icu::BreakIterator::DONE) {

    int32_t prev = current;
    current = bi->next();

    if (current == UBRK_DONE) break;

    int32_t count = current - prev;//文字の長さ

    icu::UnicodeString e;
    usr.extract(prev, count, e);
    // win32api のWCHARはutf16なのでただキャストするだけで変換できる
    TextOutW(hdc, 10, TH, (WCHAR*)e.getBuffer(), e.length());//文字を書く

    //改行
    TH += tm.tmHeight+5;
  }



  SelectObject(hdc, backup);

  EndPaint(hWnd, &ps);
}

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: