枚举长生不老药中的字符串 [英] Enumerate a string in Elixir

查看:10
本文介绍了枚举长生不老药中的字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Elixir中,如果我有一个字符串,如"José1 José2",我如何枚举它?如果尝试使用Enumfor理解,则会出现以下错误:

**(Protocol.UnfinedError)可枚举的协议未为位串类型的";josé1 josé2";实现

推荐答案

Elixir中的字符串是UTF-8编码的二进制文件。如果要枚举只是字节集合的二进制文件,则需要指定如何枚举。

String.graphemes/1-这将为您提供一个字符串列表,其中每个字符串包含一个单独的Unicode字素。如果您想要每个字符(&q;),这可能与您的意思最接近。

iex> String.graphemes("José1 José2")
["J", "o", "s", "é", "1", " ", "J", "o", "s", "é", "2"]

String.codepoints/1-这将为您提供按Unicode代码点分解的字符串列表。请注意,Unicode代码点不一定转换为人类可读的字符。

iex> String.codepoints("José1 José2")
["J", "o", "s", "é", "1", " ", "J", "o", "s", "e", "́", "2"]

您可以看到,第一个和第二个é字素用Unicode代码点表示不同。第一个是LATIN SMALL LETTER E WITH ACUTE (U+00E9),第二个是LATIN SMALL LETTER E (U+0065),后跟COMBINING ACUTE ACCENT (U+0301)

这就是您不能简单地枚举字符串的原因,因为在处理Unicode时,您必须指定您是否对字形、代码点或其他内容感兴趣。

String.to_charlist/1-提供字符串的数字Unicode代码点列表。这可用于与使用此格式的Erlang库交互。

iex> String.to_charlist("José1 José2")
[74, 111, 115, 233, 49, 32, 74, 111, 115, 101, 769, 50]

:binary.bin_to_list/1-如果您只想枚举字节。

iex> :binary.bin_to_list("José1 José2")
[74, 111, 115, 195, 169, 49, 32, 74, 111, 115, 101, 204, 129, 50]

一旦有了列表,您就可以使用理解或Enum模块中的任何函数来枚举它:

iex> for c <- String.graphemes("José1 José2"), into: "", do: c <> c
"JJoosséé11  JJoosséé22"

iex> "José1 José2" |> String.graphemes() |> Enum.join("|")
"J|o|s|é|1| |J|o|s|é|2"

还可以将comprehensions与位串生成器一起使用,以枚举字节和代码点(但不是字素)。

相当于:binary.bin_to_list/1

iex> for <<byte <- "José1 José2">>, do: byte
[74, 111, 115, 195, 169, 49, 32, 74, 111, 115, 101, 204, 129, 50]

等效于String.to_charlist/1,通过指定二进制文件的typeutf8

iex> for <<cp::utf8 <- "José1 José2">>, do: cp
[74, 111, 115, 233, 49, 32, 74, 111, 115, 101, 769, 50]

等效于String.codepoints/1,方法是指定二进制类型为utf8,并将生成的代码点转换回UTF-8二进制:

iex> for <<cp::utf8 <- "José1 José2">>, do: <<cp::utf8>>
["J", "o", "s", "é", "1", " ", "J", "o", "s", "e", "́", "2"]

附注:有关字符编码的更多信息,请参阅2003年的这篇博文:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

这篇关于枚举长生不老药中的字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆