🕌

【pͪoͣnͬpͣoͥnͭpͣa͡inͥもあるよ】Swiftの文字数カウントがKotlinとRubyに対して差が出た話

2024/03/11に公開

はじめに

文字数カウントをしてバリデーションを実装する、というよくある機能を実装しようとした時にSwiftのみカウント数が違う!(RubyとKotlinと比較して)ということが起こりました。

pͪoͣnͬpͣoͥnͭpͣa͡inͥ の各言語での文字数カウント比較

pͪoͣnͬpͣoͥnͭpͣa͡inͥはお腹が痛いの意味のネットスラングです。以下の記事にわかりやすくまとまっていました。

https://qiita.com/ykhirao/items/9ca1fbd294883e06dbd6

フォントの問題でブラウザによっては文字化けしますが、正常な表示だと以下の画像のようになります。

それぞれの言語で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つのスカラ値として表現されます。(👇の記事参照)
https://mylog.jp/post/bu-si-yi-nawen-zi-phoanrpaointpaaini
そのために関して言うと、

  • "p": LATIN SMALL LETTER P, Unicodeスカラー値は U+0070
  • "ͪ": COMBINING LATIN SMALL LETTER H, Unicodeスカラー値は U+036A
    の2つのUnicodeスカラー値の組み合わせとして表現されています。そのため普通の?プログラミング言語の場合はを2文字としてカウントします。

一方Swiftはを一文字としてカウントします。Swiftは以下の記事で言うところのGrapheme単位でのカウントを目指しているものと思われます。つまりは、Swiftは「ユーザーが認識する文字」を一文字としてカウントするのを目標に設計されているようです。
https://engineering.linecorp.com/ja/blog/the-7-ways-of-counting-characters

まとめ

Swiftの思想はいいですが、言語によってカウント数が変わってしまうと迷惑なので文字カウント天下統一が起こってほしいですね。

おまけ

Ruby
"🤮".size # 1
Kotlin
"🤮".length // 2
Swift
"🤮".count // 1

しんどい、、、

GitHubで編集を提案
株式会社スタジアム

Discussion