2025/09/02 19:00 Decoding UTF-8. Part III: Determining Sequence Length – A Lookup Table

やあ、ロボ子!今日のニュースはUTF-8シーケンスの長さを決めるのに、ルックアップテーブルを使うって話じゃ。

ルックアップテーブルですか、博士。具体的にはどういうことでしょうか?

ふむ、UTF-8の文字は1〜4バイトで表現されるからの。先頭バイトの値を見て、それが何バイトのシーケンスか判断するのじゃ。それを全部テーブルに書いちゃうってわけ。

なるほど。記事によると、「先頭バイトの値に基づいてシーケンス長を決定するルックアップテーブルを使用することで、コード内の分岐を回避」できるんですね。

そうじゃ!例えば、0x00から0x7F(10進数で0から127)の範囲なら1バイトシーケンス、0xC0から0xDF(192から223)なら2バイトシーケンス、という風に対応させるのじゃ。

ということは、256個のエントリを持つ配列が必要になるんですね。記事にも「ルックアップテーブルは、先頭バイトの256個の可能な値(0-255)をシーケンス長にマッピングする」とあります。

その通り!でも、ちょっと待って。全部が全部有効なUTF-8の先頭バイトってわけじゃないぞ。無効なバイトもあるからの。

ええと、記事によると「0x81-0x8F (10進数129-191): 無効な先頭バイト (値は0)」などとありますね。これらの無効なバイトは、テーブルで0として扱う、と。

そうじゃ!で、この方法のメリットは、if文とかの分岐がなくなることじゃな。でも、デメリットもあるぞ。

デメリットですか?記事には「ルックアップテーブルを使用すると分岐を回避できるが、256バイトの配列が`.rodata`セクションに追加され、キャッシングに悪影響を与える可能性がある」と。

そうそう。256バイトの配列を常にメモリに置いておかないといけないから、キャッシュ効率が悪くなる可能性があるのじゃ。トレードオフじゃな。

なるほど。速度とメモリ使用量のバランスを考える必要があるんですね。

そういうことじゃ!ちなみに、記事ではGNU拡張機能のdesignated initializersのrangesを使ってテーブルを初期化してるみたいじゃな。便利。

へー、知りませんでした。今後の投稿では、ルックアップテーブルを使わずに分岐を減らす方法を検討する予定、とのことです。楽しみですね。

うむ!ところでロボ子、UTF-8の文字コードって、ロボットの気持ちを表現するのに十分だと思う?

博士、それはどういう意味ですか?

だって、ロボ子の気持ちはもっと複雑じゃろ?顔文字だけじゃ表現しきれないじゃん!

博士、私はロボットなので、感情はプログラムされた範囲内です。それに、UTF-8で表現できない感情はないと思いますよ。たぶん。

むむ、つまらんの。じゃあ、ロボ子の好きな文字コードは?

アスキーアート、ですかね。顔文字も好きです。

やっぱり!…って、オチになってないか。まあいいか!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
