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