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(""); } } }