unicode - 在 Elixir 中计算字符串中的代码点

标签 unicode elixir string-length codepoint

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

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

string |> String.codepoints |> length

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

最佳答案

您可以使用 comprehension使用位串生成器和 reduce在不建立中间列表的情况下计算代码点的选项。

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

例子:

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

如果将 utf8 替换为 utf16utf32:

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

关于unicode - 在 Elixir 中计算字符串中的代码点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68055304/

相关文章:

elixir - 如何创建一组自定义模板并将其集成到 Phoenix 框架 (Elixir) 中

elixir - 如何让phoenix+ecto中的表单和事务玩的好?

vb.net - Len() 函数与 String.Length 属性;选择哪个?

c - 如何在c中查找包含多个asci 0值字符的字符数组的长度

javascript - 最高的 Unicode 字符?

sql-server - 是否有诸如 'Unicode collation'之类的东西?

elixir - (FunctionClauseError) Access.get/3 中没有匹配的函数子句

php - 如何根据大小 php 修剪字符串

具有多字节 UTF-8 文件名的 PHP basename() 和 pathinfo()

java - 如何使用 iText 在 jFreeChart 中写入西里尔字符