🐙

Rust の文字数カウントでちょっと詰まった話 - len()、chars().count -

2024/04/10に公開

はじめに

Rust の文字数カウント処理で若干詰まってしまったところを紹介します。
この記事を読んでいただければ、文字数チェックは容易にできることでしょう。
私自身のメモ的なところが多くなりそうですが、ぜひ、読んでいただけると嬉しいです。

len() はバイト数でのカウント

半角英字

&strの文字列チェックにて私は以下のように実装していました。

fn main() {
    let sample = "aaaaaa";

    // 文字数の長さを取得
    let len = sample.len();
    println!("文字数: {}", len);
}

これを cargo runすると、以下のように出力されます。

文字数: 6

期待通りの結果で、何も違和感を感じません。

全角文字

しかし、文字列が全角の日本語だった場合、どうでしょうか。

fn main() {
    let sample = "ああああああ";

    // 文字数の長さを取得
    let len = sample.len();
    println!("文字数: {}", len);
}

実行すると、、

文字数: 18

このように出力されました。
文字数の長さとして、意図していない出力でした。

調べてみると、len()は文字数のカウントではなく、バイト数が返るようです。
JavaScript 等では length() で実装していたので、少し驚きました。

chars().count() で文字数のカウント

chars().count() で文字数チェックをすると、全角文字でもバイト数ではなく文字の長さが出力されるようになりました。

fn main() {
    let sample = "ああああああ";

    // 文字数の長さを取得
    let len = sample.chars().count();
    println!("文字数: {}", len);
}
文字数: 6

さらに絵文字でもバイト数ではなく、文字の長さが出力されました。

fn main() {
    let sample = "🦀🦀🦀🦀🦀🦀";

    // 文字数の長さを取得
    let len = sample.chars().count();
    println!("文字数: {}", len);
}
文字数: 6

半角の文字数でも、意図した結果となりました。

fn main() {
    let sample = "aaaaaa";

    // 文字数の長さを取得
    let len = sample.chars().count();
    println!("文字数: {}", len);
}
文字数: 6

当初の私が想定していた結果となりました。

おわりに

今のところ、len()で文字数カウントを実装するには至っていないですが、
これから登場するシーンがある(?)かもしれません。
len()を使ったユースケースがあれば、教えてください🙇‍♂️

それでは、Cheers!

コラボスタイル Developers

Discussion