スポンサーリンク

ICUライブラリのutf16.hで定義されているU16系マクロの実例をいくつか U16_NEXT_UNSAFE

U16_NEXT_UNSAFEを使ってutf16文字列を一文字ずつ処理する。

#include <cstdio>

#pragma warning(disable:4996)

#include <unicode/utf16.h>

#include <locale>
int main()
{
  std::setlocale(LC_CTYPE, "");

  const char16_t* str = u"い👨‍👦は";

  const char16_t* p = str;
  int i = 0;
  while (p[i]) {

    bool bs = U16_IS_SURROGATE(p[i]);//サロゲートペアかどうか

    int iback = i;
    char32_t u32c;
    U16_NEXT_UNSAFE(p, i,u32c);

    if (bs==false) {
      if (p[iback] == 0x200d) {//サロゲートペアではないが、結合文字
        printf("[%x] Combine string\n", p[iback]);
      }
      else {//一文字
        printf("%s [%x] (%lc) -> %x\n",
          " true ",
          p[iback],
          p[iback],
          u32c
        );
      }
    }
    else {//サロゲートペア
      printf("%s [%x,%x] -> %x ",
        " false",
        U16_LEAD(u32c),//u32からサロゲートペアを求める
        U16_TRAIL(u32c),
        u32c
      );
      printf(" * [%x,%x]", p[iback], p[iback + 1]);//u16のサロゲートペアを表示
      puts("");
    }
  }

}
true [3044] (い) -> 3044
false [d83d,dc68] -> 1f468 * [d83d,dc68]
[200d] Combine string
false [d83d,dc66] -> 1f466 * [d83d,dc66]
true [306f] (は) -> 306f

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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


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