Unicodeの拡張領域の文字を一文字とカウントする
ScalaやJavaは拡張領域の文字をサロゲートペアで表すので、文字数をカウントしたいときに単純に文字列のサイズを取ると実際の文字数とずれてしまう。Java 1.5からはUnicodeのコードポイント を数えるメソッドが追加されているので、これを使えば正確に文字数をカウントできる。
以下、地球の絵文字を例に取って説明。
scala> val earth = "\uD83C\uDF0D" earth: String = 🌍 scala> println(earth, earth.length) (🌍,2) scala> earth.codePointCount(0, earth.length) res20: Int = 1
ちなみに、
Python
% ipython In [1]: print u"\U0001F30D", len(u"\U0001F30D") 🌍 2 % ipython3 In [1]: print(u"\U0001F30D", len(u"\U0001F30D")) 🌍 1
Ruby
% pry [1] pry(main)> p ["\u{1F30D}", "\u{1F30D}".size] ["🌍", 1]
コードポイント www.wikiwand.com