C言語でやったUnicodeの正規化のC++版だ。C言語の時と同じようにICUを使う。ICUには、C++のAPIも用意されているのでそっちを使う。

こんな感じだ。

#include <stdio.h>
#include <stdlib.h>
#include "unicode/unistr.h"
#include "unicode/normalizer2.h"

void dump(char *mem, int size);

int main()
{
	icu::UnicodeString src("がぎぐげご", "utf-8");
	printf("src.length()=%d\n", src.length());
	dump((char*)src.getBuffer(), src.length() * sizeof(UChar));
	
	// (1) Unicodeの正規化(NFD)の準備
	UErrorCode err = U_ZERO_ERROR;
	const icu::Normalizer2 *normalizer = icu::Normalizer2::getNFDInstance(err);
	if(U_FAILURE(err)) {
		fprintf(stderr, "err=%d\n", err);
		exit(1);
	}

	// (2) 正規化する。
	err = U_ZERO_ERROR;
	icu::UnicodeString dest = normalizer->normalize(src, err);
	if(U_FAILURE(err)) {
		fprintf(stderr, "err=%d\n", err);
		exit(1);
	}
	printf("dest.length()=%d\n", dest.length());
	dump((char*)dest.getBuffer(), dest.length() * sizeof(UChar));
	

	return 0;
}


void dump(char *mem, int size)
{
	int addr, offset;
	
	for(addr = 0; addr < size; addr += 16) {
		printf("%04X ", addr & 0xffff);
		for(offset = 0; offset < 16; offset++) {
			if(addr + offset >= size) {
				break;
			}
			printf("%02X ", mem[addr + offset] & 0xff);
		}
		printf("\n");
	}	
}

(追記)
コンパイルは、こうだ。

$ g++ -Wall -o unicode2 `icu-config --cppflags --ldflags` unicode2.cpp