unicode にはサロゲートペアとは別に、複数の 16bit を一組として合成して、一つの文字を表現するものがある。「か」に「゛」(濁点)を加えて「が」にしたり、「A」 にウムラウトを加えて「A」にしたりするものだ。インドのデーバナガリー語のように複数の unicode 文字符号を合成しても、それしか unicode 表現がないものは問題ないが、合成文字の多くはそれと同等の unicode のコードポイントがある。以下のデモを見てほしい。
* (let ((vector (make-array 6 :initial-contents '(255 254 #x4B #x30 #x99 #x30) :element-type '(unsigned-byte 8))))
(babel:octets-to-string vector :encoding :utf-16))

"が""
* (let ((vector (make-array 4  :initial-contents '(255 254 #x4C #x30) :element-type '(unsigned-byte 8))))
(babel:octets-to-string vector :encoding :utf-16))

"が"
* (let ((vector (make-array 6 :initial-contents '(255 254 #x41 0 #x08 #x03) :element-type '(unsigned-byte 8))))
(babel:octets-to-string vector :encoding :utf-16))

"Ä"
* (let ((vector (make-array 4  :initial-contents '(255 254 #xC4 0) :element-type '(unsigned-byte 8))))
(babel:octets-to-string vector :encoding :utf-16))

"Ä"
すると意味的には同じでも、unicode では異なる文字があることになり、文字比較などで何かと都合が悪い。文字として等価であれば、コードポイントとしても等価にするために、正規化という操作がある。unicode 正規化についての詳細な情報はここを参考にされたい。

正規化には4種類もの形式があるが、RDFでは NFC を使うべきとされている。私の訳したRDF意味論を参照されたい。となると、unicode 正規化を行うプログラムが欲しくなる。これまで、正規化のためのフィルタプログラムを探してきたが、なかなか情報が少なくて、苦労する。その中で唯一これが事実上の標準ではないか、と思われるものが International Components for Unicode (ICU) だ。これには C/C++ (ICU4C) とJava (ICU4J) プログラムがある。何とかこの Lisp 版を準備するのが、最初の具体的な仕事になる。