てきとうなさいと べぇたばん

2026年2月27日現在、書記素クラスターにはコードポイントの上限はない

TOP > てきとうにこらむ > プログラミング日記 > 2026年2月27日現在、書記素クラスターにはコードポイントの上限はない

emoji bombをSwift(書記素クラスターベースのString)とPHPとで読んでみた結果:同じ 書記素クラスターの実験:emoji bomb

書記素クラスターについて

皆さんは書記素クラスターについてわかっていますでしょうか?わかっていなくても必須の概念になっています。なぜなら👨‍👩‍👦の絵文字ですでに書記素クラスターにぶつかっているからです。

書記素クラスターとは?

Unicodeで1文字を指す言葉です。grapheme clusterと英語でいいます。書記素というのが言語自体の1文字の概念でして、そこからUnicodeが書記素クラスターというものを定義しました。雑なので間違ってたらすみません汗

複数コードポイントを持っているかもしれない書記素クラスター

その書記素クラスターは、複数のUnicodeコードポイントを持っている場合があります。定義はUAX#29にあります。

簡単にざっくりいうと、各コードポイントに「この文字は次のコードポイントを読んで」とか読まないでとかが情報としてあります。それを参照してループすることで書記素クラスターというものがプログラムでも読めます。見た目のためにここまでしてます。

その書記素クラスターは何コードポイント?

そして、そのコードポイントには上限がありません。ICUというUnicode公式のライブラリのIssueで聞いてみましたが、ありませんとのことでした。

https://unicode-org.atlassian.net/browse/ICU-23302

ない、ということはちょっとヤバいんですね。このIssueでも指摘しているとおり、「数百メガバイトの1書記素クラスター」という極端な書記素クラスターが出来上がってしまいます。見た目は1文字です。catコマンドで開いただけでクラッシュする代物です。怖いですね。

こういうふうに、Unicodeは理論上無限と考えていますが、機械は有限なので、DoSが出来てしまいます。クラッシュするんですからね。で、それは危ないんじゃないか?ということで、書記素クラスターへの外部入力にはコードポイントの上限を設定するような感じで制限をかけてやってDoSを回避しながら書記素クラスターを数えるということが必要なんじゃないかということがわかってきました。

日本語ならば、ぼくがBuriKaigiで発表した内容を参照いただけるとヤバさが伝わるかな?と思います。

ICUで対応しないならば、ライブラリやプログラミング言語レイヤーで対処するしかありません。つい先日のPHP勉強会@東京で作ったスライドです。

というわけで、コードポイントの制限をかけるという機能を追加していきたいと思っています。

マジでヤバいんだけど!!

書記素クラスターは上限が必要だと思っていますが、仕様上ないとのことですので、各プログラミング言語というかアプリケーションは考慮に入れないといけないことになります。できればUnicodeの仕様書に「現実的には書記素クラスターにはコードポイントの上限が設定されるべき」などという文言が追加されるのが望ましいですが、ICUで聞いてクローズされちゃったのでどうしようもないです。

だれか助けてもらえると嬉しいんですが…

2026/02/27 0:25