Binaries and charlists
| Binaries are bytes | |
| Charlists are lists | |
| Convert between them | |
| Match binary segments |
Binaries are bytes
Every Elixir string is a binary: a packed sequence of bytes stored with UTF/8 encoding. The byte_size function counts those bytes, while String.length counts visible characters, so the two answers differ on multibyte text. The is_binary check confirms that a value is a binary at all.
IO.inspect(byte_size("hello"))
IO.inspect(is_binary("hello"))
5
true
Charlists are lists
A charlist is an older Erlang style string: a plain list where each element is a character code. The ~c sigil builds one, so ~c followed by quotes reads clearly while staying a list underneath. Erlang libraries often return charlists, which is why Elixir code still meets them.
text = ~c"hi"
IO.inspect(is_list(text))
IO.inspect(hd(text))
true
104
Convert between them
The to_string function turns a charlist into a binary, and to_charlist goes the other way. Convert at the boundary: keep Elixir strings inside your own code and translate only when an Erlang function needs a charlist.
IO.inspect(to_string(~c"hi"))
IO.inspect(to_charlist("hi"))
"hi"
~c"hi"
Match binary segments
Pattern matching opens a binary and names its parts in one step. The first segment takes the leading byte while rest typed as binary holds everything left over. This style powers parsers that walk through raw bytes without indexes or loops.
<<first, rest::binary>> = "hello"
IO.inspect(first)
IO.inspect(rest)
104
"ello"
Next: Exceptions
Article author: Arthur Isaev