Actually, UTF-16 is different again from both UTF-8 and codepoints (also explained in the link I posted). I'm not exactly an expert on this, but I'll try to help as far as I can.
I think you could get much of the desired effect with UTF-32, at the cost of allocating four bytes for every single character. There's also something called UCS-4, but don't ask me about details here. Depending on what you actually want to do with the characters, you could either try to write everything from scratch based on the standard (UTF-8 doesn't look terribly complicated to me), or, as you said, use one of the available libraries.
Documentation for iconv is available via "man 3 iconv" and "info iconv". Depending on your distribution, you may need to install glibc-devel, man-pages or similar for this.
Also, Qt and Glib have facilities for handling Unicode text and there's the dedicated
libunicode.