🕌
【pͪoͣnͬpͣoͥnͭpͣa͡inͥもあるよ】Swiftの文字数カウントがKotlinとRubyに対して差が出た話
はじめに
文字数カウントをしてバリデーションを実装する、というよくある機能を実装しようとした時にSwiftのみカウント数が違う!(RubyとKotlinと比較して)ということが起こりました。
pͪoͣnͬpͣoͥnͭpͣa͡inͥ の各言語での文字数カウント比較
pͪoͣnͬpͣoͥnͭpͣa͡inͥはお腹が痛いの意味のネットスラングです。以下の記事にわかりやすくまとまっていました。
フォントの問題でブラウザによっては文字化けしますが、正常な表示だと以下の画像のようになります。

それぞれの言語でpͪoͣnͬpͣoͥnͭpͣa͡inͥの文字数カウントをしてみます。
Ruby
"pͪoͣnͬpͣoͥnͭpͣa͡inͥ".size # 19 💪
Kotlin
"pͪoͣnͬpͣoͥnͭpͣa͡inͥ".length // 19 💪
Swift
"pͪoͣnͬpͣoͥnͭpͣa͡inͥ".count // 10 🤮
結果からわかること
pͪoͣnͬpͣoͥnͭpͣa͡inͥの上側についている特殊文字は、Unicodeの1つのスカラ値として表現されます。(👇の記事参照)
そのためpͪに関して言うと、
- "p": LATIN SMALL LETTER P, Unicodeスカラー値は U+0070
- "ͪ": COMBINING LATIN SMALL LETTER H, Unicodeスカラー値は U+036A
の2つのUnicodeスカラー値の組み合わせとして表現されています。そのため普通の?プログラミング言語の場合はpͪを2文字としてカウントします。
一方Swiftはpͪを一文字としてカウントします。Swiftは以下の記事で言うところのGrapheme単位でのカウントを目指しているものと思われます。つまりは、Swiftは「ユーザーが認識する文字」を一文字としてカウントするのを目標に設計されているようです。
まとめ
Swiftの思想はいいですが、言語によってカウント数が変わってしまうと迷惑なので文字カウント天下統一が起こってほしいですね。
おまけ
Ruby
"🤮".size # 1
Kotlin
"🤮".length // 2
Swift
"🤮".count // 1
しんどい、、、
GitHubで編集を提案
Discussion