Rust的字串是使用UTF-8編碼的,如果直接使用str
或是String
的len
方法,會得到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
這個詞出現了一次。