Goal
文字列と文字リストの違いについて学ぶ。
また、Elixirのバイナリについて習得する。
また、Elixirのバイナリについて習得する。
Dev-Environment
OS: Windows8.1
Erlang: Eshell V6.4, OTP-Version 17.5
Elixir: v1.0.4
Erlang: Eshell V6.4, OTP-Version 17.5
Elixir: v1.0.4
Wait a minute
文字列(Strings)と文字リスト(Char lists)の違いについても学んでみます。
また、Elixirでのバイナリの扱い方を習得したいと思います。
また、Elixirでのバイナリの扱い方を習得したいと思います。
UTF-8とは何か?・・・リンク先を参照して下さい。
参考: ギークを目指して - 文字コードの考え方から理解するUnicodeとUTF-8の違い
参考: ギークを目指して - 文字コードの考え方から理解するUnicodeとUTF-8の違い
Index
Binaries, strings and char lists
|> Strings and Char Lists
|> Strings
|> Char Lists
|> Binaries
|> Extra
|> Strings and Char Lists
|> Strings
|> Char Lists
|> Binaries
|> Extra
Strings and Char Lists
文字列と文字リストの違いについて。
簡単なまとめ・・・
- Elixirのデフォルトエンコードは、(BOMなし)UTF-8
- 文字列と文字リストはどちらもバイナリ
- 文字列はUTF-8でエンコードされたバイナリ
- 文字リストは文字(コードポイント)のリスト
- “”(二重引用符)で囲めば文字列として扱われる
- ‘’(単一引用符)で囲めば文字リストとして扱われる
- コードポイントの値を得るには?(疑問符)を使う
Description:
文字には割り当てられているコードポイントと言うものがある。
例えば、aなら97といった感じに・・・
(コードポイントは1byte以上の時もある)
文字には割り当てられているコードポイントと言うものがある。
例えば、aなら97といった感じに・・・
(コードポイントは1byte以上の時もある)
iex> ?a
97
文字列も文字リストのどちらもバイナリ。
iex> string = "hello"
"hello"
iex> is_binary(string)
true
iex> char_list = "hello"
"hello"
iex> is_binary(char_list)
true
Strings
文字列について。
簡単なまとめ・・・
(重複部分があります)
(重複部分があります)
- 文字列はUTF-8でエンコードされたバイナリ
- “”(二重引用符)で囲めば文字列として扱われる
byteサイズと文字列の長さを取得してみる。
iex> string = "hello"
"hello"
iex> byte_size(string)
5
iex> String.length(string)
5
コードポイント毎に分割してみる。
iex> String.codepoints(string)
["h", "e", "l", "l", "o"]
詳しく知りたければドキュメントを参照して下さい。
ドキュメント: hexdocs - v1.0.5 Elixir String
ドキュメント: hexdocs - v1.0.5 Elixir String
Char Lists
文字リストについて。
簡単なまとめ・・・
(重複部分があります)
(重複部分があります)
- 文字リストは文字(コードポイント)のリスト
- ‘’(単一引用符)で囲めば文字リストとして扱われる
iex> char_list = 'hello'
'hello'
iex> is_list(char_list)
true
Binaries
バイナリについて。
簡単なまとめ・・・
- <<>>で囲めばバイナリとして扱われる
- バイナリはバイトの連なり
- ヌルバイト<<0>>を結合させると文字列のバイナリが見れる
- 値はバイナリではなくビット列として扱われる
- バイナリは8で割り切れる数のビット列の集まり(8bitずつ)
- 文字列として妥当ではない場合がある
バイナリを使ってみる。
iex> bin = <<0, 1, 2, 3>>
<<0, 1, 2, 3>>
iex> byte_size(bin)
4
iex> <<0, 1>> <> <<2, 3>>
<<0, 1, 2, 3>>
iex> "hello" <> <<0>>
<<104, 101, 108, 108, 111, 0>>
iex> <<97 :: utf8>>
"a"
バイナリでパターンマッチをさせてみる。
iex> <<0, 1, x>> = <<0, 1, 2>>
<<0, 1, 2>>
iex> x
2
iex> <<0, 1, x>> = <<0, 1, 2, 3>>
** (MatchError) no match of right hand side value: <<0, 1, 2, 3>>
iex> <<0, 1, x :: binary>> = <<0, 1, 2, 3>>
<<0, 1, 2, 3>>
iex> x
<<2, 3>>
少し変わったパターンマッチ。
(文字列もバイナリだから可能なやり方)
(文字列もバイナリだから可能なやり方)
iex> "he" <> llo = "hello"
"hello"
iex> llo
"llo"
ビット列を使ってみる。
iex> bit = <<1 :: size(1)>>
<<1::size(1)>>
iex> is_binary(bit)
false
iex> is_bitstring(bit)
true
iex> bit_size(bit)
1
Extra
文字列や文字リストを変換してみます。
文字列->文字リスト&文字リスト->文字列
iex> string = "hello"
"hello"
iex> char_list = to_char_list(string)
'hello'
iex> to_string(char_list)
"hello"
iex> string == to_string(char_list)
true
Speaking to oneself
バイナリ、文字列、文字リストはやや理解し辛い部分がありますね。
分かってしまえば大したことではないのですが。
分かってしまえば大したことではないのですが。
これで、バイナリ、文字列、文字リストについては分かりました。
必要がなければ文字列使っておけば問題ないですよ。
きっと、おそらく、多分、メイビー(笑)
必要がなければ文字列使っておけば問題ないですよ。
きっと、おそらく、多分、メイビー(笑)