3

String.length/1函数返回UTF -8 二进制文件中的字素数。

如果我想知道字符串中有多少个 Unicode代码点,我知道我可以这样做:

string |> String.codepoints |> length

但这会产生所有代码点的不必要的中间列表,并迭代字符两次。有没有一种方法可以直接计算代码点,而不产生中间列表?

4

1 回答 1

3

您可以使用带有位串生成器的理解reduce和计算代码点的选项,而无需构建中间列表。

for <<_::utf8 <- string>>, reduce: 0, do: (count -> count + 1)

例子:

iex> string = "‍♂️&quot;
iex> for <<_::utf8 <- string>>, reduce: 0, do: (count -> count + 1)
5
iex> string |> String.codepoints |> length
5
iex> String.length(string)
1

这有一个额外的好处,它也适用于 UTF-16 和 UTF-32 字符串,如果你utf8utf16or替换utf32

iex> utf8_string = "I'm going to be UTF-16!"
"I'm going to be UTF-16!"
iex> utf16_string = :unicode.characters_to_binary(utf8_string, :utf8, :utf16)
<<0, 73, 0, 39, 0, 109, 0, 32, 0, 103, 0, 111, 0, 105, 0, 110, 0, 103, 0, 32, 0,
  116, 0, 111, 0, 32, 0, 98, 0, 101, 0, 32, 0, 85, 0, 84, 0, 70, 0, 45, 0, 49,
  0, 54, 0, 33>>
iex> for <<_::utf8 <- utf8_string>>, reduce: 0, do: (count -> count + 1)
23
iex> for <<_::utf16 <- utf16_string>>, reduce: 0, do: (count -> count + 1)
23
于 2021-06-20T11:22:36.117 回答