10で絵文字を書記素クラスタ単位で数える雑記UWPからP/Invokeすることが許可されているAPIが列挙されているページがあります。今日も特に理由もなく眺めていたらicuuc.dllが16299から使えるようになっていたことに今更気づきました。Unicodeの略で、Unicodeの難しいいろいろを面倒見てくれるライブラリです。今日はこれを使って絵文字を書記素クラスタ単位で数えてみたいと思います。今回のコードはこのページを参考にしました。C++からC#に書き直しただけでほぼそのままです。qiita.com書記素クラスタ詳しいことはここを読むといいと思います。ufcpp.netUnicodeを1文字ずつ分割するときに使うアルゴリズムです。調べても基本的にテーブル引きしないといけないようなことが書いてました。.NETから呼ぶ.NETから呼ぶにはP/InvokeすればOKです。今回は、書記素クラスタに分割するAPI周りだけ定義を作りました。gist.github.comこれを使って、こんなコードを書くと書記素クラスタに基づいて、何文字で構成された文字列なのかがわかります。参考にしたコードでは、utext_openUTF8を使っていたけれども、.NETのStringはUTF-16なのでutext_openUCharsを使ったほうが都合がいいです。n;}また、文字を切り出すにはこんな感じで呼べばよさそうです。next;}Icuuc.ubrk_close(iterator);Icuuc.utext_close(utext);比べてみる今回作ったコードと、.NETのStringInfoクラスと、String[Index]でえられる結果を並べてみました。左から、ICU、StringInfo、String[Index]です。ICUは1文字としてカウントされてます。StringInfoはサロゲートペアを認識はしてますが、書記素分割には対応してないので11文字、String[Index]はサロゲートペアをバラバラにカウントするので19文字に見えています。11文字としてカウントされていたのが正しく1文字になるのでTwitterクライアントの文字カウントがより正確になります*1。ThinQ向け、ワイドモードボタンを増やすアプリを作ってみました月別アーカイブはてなブログをはじめよう!tmytさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。