こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回はString.codepoints/1 と String.graphemes/1 の比較を比較して学んだことをまとめます。2024/6/16に開催したイベントpiyopiyo.ex #35:もくもく作業タイムの成果です。
目的
String.codepoints/1
と String.graphemes/1
の違いを理解する
前提
String.codepoints/1 と String.graphemes/1それぞれに対して下記の変数を使用します。
greeting = "Hello World!"
string = "é"
"é"はU+0065 と U+0301 の結合文字列です。1
実行環境
Windows 11 + WSL2 + Ubuntu 22.04
Elixir v1.16.2-otp-26
Erlang v26.0.2
結果
String.codepoints/1はUTF-8のコードポイントごとに分割
結合文字列なし
String.graphemes/1と結果は同じです。
String.codepoints(greeting)
["H", "e", "l", "l", "o", " ", "W", "o", "r", "l", "d", "!"]
結合文字列あり
結合文字列はコードポイントが2つなので、リストの要素数は2になります。
String.codepoints(string)
["e", "́"]
String.graphemes/1はユーザーが文字として認識する単位ごとに分割
ユーザーが文字として認識する単位のことを書記素(grapheme)と呼びます。2
結合文字列なし
String.codepoints/1と結果は同じです。
String.graphemes(greeting)
["H", "e", "l", "l", "o", " ", "W", "o", "r", "l", "d", "!"]
結合文字列あり
結合文字列は書記素が1つなので、リストの要素数が1になります。
String.graphemes(string)
["é"]
~Elixirの国のご案内~
↓Elixirって何ぞや?と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます
↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ!私もエンジニア未経験から学習中です。
↓We Are The Alchemists, my friends!3
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。4
-
Elixirは文字列をエンコードするためにUTF-8を使用している https://hexdocs.pm/elixir/1.16.2/String.html#module-utf-8-encoded-and-encodings ↩
-
Elixirにおける書記素とは https://hexdocs.pm/elixir/1.16.2/String.html#module-grapheme-clusters ↩
-
@torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。 ↩