Rust的字串是使用UTF-8編碼的,如果直接使用str或是Stringlen方法,會得到UTF-8資料的位元組的數量,而非字元數。因為在UTF-8編碼下,一個字元不一定是一個位元組,例如4會被編碼成[52]ß會被編碼成[195, 159]會被編碼成[228, 184, 173]𩸽(ㄌㄨㄥˇ)會被編碼成[240, 169, 184, 189]。那麼要如何用Rust來計算字元(character or letter)數量,甚至是詞(word)的數量呢?



要計算字串中的字元數量,最簡單的方式是Chars迭代器的count方法。程式如下:

let count = "哈囉 world".chars().count();

雖然上面的程式可以讓我們知道字串的字元數量,但若想要知道其中有幾個詞語就不行了。

Words Count

「Words Count」是筆者開發的套件,可以利用空格來計算字元數量和詞的數量。

Crates.io

Cargo.toml

words-count = "*"

使用方法

words_count這個crate底下的count函數可以用來分析傳入的字串當中的字詞數量。如下:

use words_count::WordsCount;

assert_eq!(WordsCount {
    words: 20,
    characters: 31,
    whitespaces: 2,
    cjk: 18,
}, words_count::count("Rust是由 Mozilla 主導開發的通用、編譯型程式語言。"));

count函數回傳的結果中,words是詞的數量,兩個空格之間的非CJK字元會被當作是一個詞,兩個連續的減號--會被斷詞(一個減號則不會),每個CJK字元視為一個獨立的詞;characters是字元的數量;whitespaces是空格的數量;cjk是CJK字元的數量。

words_count這個crate底下的count_separately函數可以用來計算傳入的字串中,每個詞語分別出現的次數。如下:

let result = words_count::count_separately("apple banana apple");

assert_eq!(2, result.len());
assert_eq!(Some(&2), result.get("apple"));

以上程式,apple這個詞出現了兩次,banana這個詞出現了一次。