16
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ElixirAdvent Calendar 2022

Day 18

今日のElixirSchoolメモ13「文字列」

Posted at

Elixir Schoolの勉強メモです。

文字列

Elixirにおいて文字列とはバイトのシーケンス。

iex(19)> string = <<104,101,108,108,111>>
"hello"
iex(20)> string <> <<0>>
<<104, 101, 108, 108, 111, 0>>

文字列に0というバイトを追加すると、有効な文字列ではなくなるため、IExは文字列をバイナリとして表示する。
これは、文字列を表現するバイトがなんなのか確認したいときに有用。

<<>>記法はコンパイラにこれらのシンボルで囲まれた中身はバイト列であることを示す。

文字リスト

内部ではElixirの文字列は文字の配列というよりはバイトのシーケンスで表現されており、Elixirは複数の文字のリストである文字リストという型を別に持っている。

Elixirの文字列はダブルクォートで生成され、一方文字リストはシングルクオートで生成される。

シングルクオートで生成される文字リストから得られるここの値はバイナリで表現されているコードポイントで、UTF-8でエンコードされている。

iex(23)> 'hełło'
[104, 101, 322, 322, 111]
iex(24)> "hełło" <> <<0>>
<<104, 101, 197, 130, 197, 130, 111, 0>>

322はł のコードポイントで、UTF-8でエンコードされているので、197130という2つのバイトになっている。

?を使って、文字のコードポイントを取得することができる。
この記法は、文字のリストから情報を抽出するパターンを使うときに役に立つことが多い。

iex(26)> ?Z
90

書紀素とコードポイント

コードポイントはたた単純にUnicodeの文字で、UTF-8のエンコーディングに応じて1バイト以上のバイトで表現されるものとして差し支えない。
ASCIIの範囲外の文字は常に2バイト以上にエンコードされる。たとえばá, ñ, èのようなチルダやアクセントのついたラテン文字は2バイトにエンコードされる。
アジア言語の文字はしばしば3から4バイトにエンコードされる。
書記素は1文字にレンダリングされる複数のコードポイントから成る。

文字列関数

length/1

書記素の長さを返す。

iex(31)> String.length "Hello"
5

replace/3

iex(33)> String.replace("Hello", "e", "a")
"Hallo"

duplicate/2

iex(34)> String.duplicate("Oh my ", 3)
"Oh my Oh my Oh my "

split/2

iex(36)> String.split("Hello World", " ")
["Hello", "World"]
16
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?