23:53UTF-8って素晴らしいですよね。unicodeは元々、世界中の全ての文字を16bitで表現するという英語圏以外の人からすればあまりに愚かな試みからスタートしましたが、もちろん破綻。16bitを使いながら、サロゲートペアを使って16bit以上のコードも表現するようになりました。結局サロゲートペアが必要な時点でUTF-16は欠点ばかりのものとなってしまいました。最近よく使われるのはUTF-8です。ASCIIコードと互換性が保ちやすく大変便利ですね。UTF-8は結局のところUTF-32をシリアライズしただけのものなんですが、へぇよく考えてるなぁという感じなのです。任意のバイトストリームから混同せずに文字列を取り出せます。欠点もあって、色々処理をするときに文字ごとに長さが違うので厄介です。そこでUTF-8から32bit表現(UTF-32)に変換するコードを書いてみました。プログラムの内部的にはUTF-32を使うと捗りますので。このようなUTF-8の欠点はサロゲートペアがある時点でUTF-16でも同様なんですが、サロゲートペアはあまり出てこないので無視してしまってる駄目な処理系もあるような気がします。セキュリティの観点からはUTF-8の冗長表現が問題になることもあります。本来ASCIIコードである文字でももっと大きなバイス数で表現することが出来てしまうので不正文字チェックを抜けてしまうということです。10101111)は、2バイトのUTF-8として扱うと[101111]の部分がデータになりますので、0x2F(バックスラッシュ)と等価になります。小さいバイトのコードは大きなバイト数でも表現出来てしまうため、単純チェックだとすり抜けるということです。仕様ではこのようなバイト列は不正なUTF-8バイト列としなければなりません。10646では存在しています。以下のコードではそのような不正なUTF-8もそのまま変換します。