簡體   English   中英

在 Elixir 中計算字符串中的代碼點

[英]Count codepoints in a string in Elixir

所述String.length/1函數返回字形的在UTF-8個二進制數。

如果我想知道字符串中有多少個 Unicode代碼點,我知道我可以這樣做:

string |> String.codepoints |> length

但這會產生一個不必要的所有代碼點的中間列表,並迭代字符兩次。 有沒有一種方法可以直接計算代碼點,而無需生成中間列表?

您可以使用一個理解有位串發生器和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

這有一個額外的好處,它也適用於 UTF-16 和 UTF-32 字符串,如果你用utf16utf32替換utf8

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM