我是 Elixir 的新手(一般编程也是如此),我不明白 Elixir 在这里启用了字符串和 ASCII 之间的解释。
result = for << n <- "abc132" >>, do: n + 1
IO.puts(result) #bcd243 - I assume this converts to ASCII and then back to string
string = "abc123"
for n <- String.to_charlist(string) do
IO.puts(n+1) #98,99,100,50,51,52 - this converts to ASCII, but doesn't convert back to string?
end
Elixir 有两种不同的字符串表示形式(Erlang 也是如此)。默认的 Elixir String 是一个 UTF-8 编码的 Erlang
binary
对象; “charlist”字面意思是字符列表。
这里的一个重要技术说明是,该字符串是 UTF-8 编码的 Unicode,而不一定是 ASCII。如果您的字符串仅包含 ASCII 字符,那么它就是 ASCII,但一般情况下您不能保证这一点。二进制文件很可能包含与单个字符相对应的多个字节。例如,您可以手写 U+00A0 NO-BREAK SPACE
iex> <<0xc2, 0xa0>>
" "
iex> <<0xc2, 0xa0>> |> String.length()
1
这是两个字节但一个字符。
在第二个循环中,您已将字符串转换为代码点列表,然后操作代码点。由于备用字符串表示形式是代码点的列表,因此您可以将每个代码点包装在列表中
for n <- String.to_charlist(string) do
IO.puts([n+1]) # creating a single-character charlist-format string
end
但是由于字符列表是一个列表,因此您也可以使用正常的函数技术来操作它。
iex> string |>
...> String.to_charlist() |>
...> Enum.map(fn c -> c + 1 end) |>
...> to_string()
"bcd234"
最后一种形式并不特别依赖于 ASCII 字符串。