mmag

ハマったことメモなど

codepointsとgrapheme

Elixirのドキュメントを眺めていて、String.codepointsString.graphemesの違いがわからなかったので調査。

ソースにはこんなコメントが。

複数の記号で1文字をなすものを表現するのがGraphemeという解釈でいいのかな。 つまりElixir特有のものではなくてUnicodeに関するもののようですね。

Elixir v0.14.2(現時点での安定版)では、Extend Grapheme Clusterアルゴリズムというものが使われているらしいので、コメントにあったURLへ飛んでみるとこんな表を発見。 Grapheme Clusterの一部を例示している様子。

タミル語タイ語の一部が載っていたので試してみる。実験台は、Google翻訳で「もじもじ」をタミル語に訳した「தனிமையில்」で。

iex(1)> String.codepoints("தனிமையில்")
["", "", "ி", "", "", "", "ி", "", ""]
iex(2)> String.graphemes("தனிமையில்")
["", "னி", "மை", "யி", "ல்"]

おお。ぜんぜん違う結果が。

普段は日本語と英語くらいしか扱わないので気にしなくていいだろうけど、覚えておきましょ。

おまけ

iex(3)> String.length("தனிமையில்")
5