Unicodeの文字数を書記素単位で数える
書記素を自力で判定するのはほぼ不可能。(もちろんちゃんと仕様を理解すれば実装する事はできる) 仕様は以下に書かれている。
通常はライブラリを使う事になる。
ICU4C C/C++用
ICU4J Java 用
Unicode の書記素自体が持つ問題
長さは無限(長さ制限がない)
縦幅横幅はフォントで実際に描画するまで分からない。
等幅フォントならワンチャン?
書記素とはまた別にレンダリング時に合字(リガチャー)(fi(fi) のようなもの。)が現れる可能性はある。一字ごとにサイズを測るというアプローチはうまく行かない。
通信などで分割されて送られてきてしまうことがある。明確に分割可能と言える文字が現れるまでは継続している可能性がある。
多くのライブラリでは、単純に文字列をそのまま解釈しようとするため、ここが正しく動かない。最後の1文字はペンディングさせておく必要がある。
「あ゙」のような結合文字だと濁点が分かれて受信されるかもしれない。
C/C++
C#
ICU4C をC#から呼び出す例
JavaScript
現在は Intl.Segmenter というAPIが増えた。
Rust
参考
どのキャラクター端末なら正しく書記素が表示できるかは分からない…
プログラムで書記素を正しく計数しても、表示でずれるかもしれない。
書記素単位で処理する事で避けられるのは、1つの書記素をうっかりバラバラにしてしまうトラブル。