Scala日記

Scalaの備忘録。ときどき研究の話。

Unicodeの拡張領域の文字を一文字とカウントする

ScalaJavaは拡張領域の文字をサロゲートペアで表すので、文字数をカウントしたいときに単純に文字列のサイズを取ると実際の文字数とずれてしまう。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]
  1. コードポイント www.wikiwand.com

  2. サロゲートペア www.wikiwand.com