Elixir 将单个字符串转换为其代码点

Elixir 将单个字符串转换为其代码点,elixir,Elixir,我知道我可以使用?a语法获取字符的码点 iex> ?a 97 但是如果a是二进制的,“a”呢?在这种情况下,如何获取代码点?您可以使用二进制模式匹配: iex(1)>=“a” “a” iex(2)>码点 97 或使用,并提取第一个值: iex>“a”|>String.to|u charlist |>hd 97 小心UTF-8分解形式。在进一步处理之前调用输入总是比较安全的(将:nfc作为第二个参数传递) 人们可能会想到 <<cp::utf8>> = "á"

我知道我可以使用
?a
语法获取字符的码点

iex> ?a
97

但是如果
a
是二进制的,
“a”
呢?在这种情况下,如何获取代码点?

您可以使用二进制模式匹配:

iex(1)>=“a”
“a”
iex(2)>码点
97
或使用,并提取第一个值:

iex>“a”|>String.to|u charlist |>hd
97

小心UTF-8分解形式。在进一步处理之前调用输入总是比较安全的(将
:nfc
作为第二个参数传递)

人们可能会想到

<<cp::utf8>> = "á"
为了安全地匹配组合和分解,无论发生什么情况,都可以预先将其显式规范化为组合形式

with <<cp::utf8>> <- String.normalize("á", :nfc),
  do: cp
#⇒ 225
但是


我认为您的字符串得到了规范化,因为当我复制和粘贴时,
a
s是等效的。如果我做了
“a\u0301”
,我就可以复制。我检查了三次。你的终端可能会在粘贴时正常化。看起来好像有什么黑魔法正在发生。即使是文本编辑也会使其正常化。我通过保存这个页面的HTML并将其编辑成一个长生不老药脚本来测试它。有趣的是,
?a
易受相同问题的影响:
**(SyntaxError)unicode.exs:1:意外标记:“́”(第11列,代码点U+0301)
LOL MacOS就是这样的MacOS<代码>?́#⇒769在我的Linux机器中可以在任何终端上正常工作,没有任何问题。这正是我一直反对使用MacOS进行开发的原因<代码>?带有分解的锐字符的́将不起作用,因为
捕获唯一的符号,并且不进行任何规范化<代码>>#⇒225工作得很好(由
“á”
组成)
"á" == "á"
#⇒ false
with <<cp::utf8>> <- String.normalize("á", :nfc),
  do: cp
#⇒ 225
"á"
|> String.normalize(:nfc)
|> String.to_charlist()
|> hd()
#⇒ 225
"á"
|> String.to_charlist()
|> hd()
#⇒ 97