这两种理解有何不同?

问题描述 投票:0回答:1

我是 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
1个回答
0
投票

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 字符串。

© www.soinside.com 2019 - 2024. All rights reserved.