Learn Rust Coding · レッスン

UTF-8とChars

Unicodeの扱い

レッスン 4/413 ステップ

「UTF-8とChars」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。

Rustの文字列はUTF-8

RustのすべてのStringと&strはUTF-8でエンコードされます。つまり、ASCIIだけでなく、あらゆるUnicode文字を含められます。

fn main() {
    let s = String::from("caf\u{e9}");
    println!("{}", s);
}

UTF-8とは

UTF-8では、各Unicode文字を1〜4バイトでエンコードします。ASCII文字は1バイト、アクセント付き文字や絵文字はより多くのバイトを使います。

fn main() {
    let ascii = "A";          // 1 byte
    let accent = "\u{e9}";    // 2 bytes (e-acute)
    println!("{} bytes vs {} bytes", ascii.len(), accent.len());
}

バイトと文字の違い

マルチバイトエンコーディングのため、len()が返すのはバイト数であり、文字数はそれより少ない場合があります。

fn main() {
    let s = "caf\u{e9}";
    println!("bytes {}", s.len());
    println!("chars {}", s.chars().count());
}

char型はUnicodeを表す

Rustのcharは4バイトの値で、1バイトをはるかに超える任意のUnicodeスカラー値を保持できます。

fn main() {
    let letter = 'Z';
    let accented = '\u{f1}'; // n with tilde
    println!("{} {}", letter, accented);
}

文字を反復処理する

chars()を使うと、文字単位でテキストをたどれます。マルチバイト文字も正しく処理できます。

fn main() {
    let s = "a\u{e9}z";
    for c in s.chars() {
        println!("{}", c);
    }
}

数値でインデックス指定できない理由

Rustでは、文字列に対するs[0]は許可されていません。文字によってバイト数が異なるため、単一の数値によるインデックス指定は曖昧で安全ではないからです。

fn main() {
    let s = "hello";
    // let c = s[0]; // error: cannot index a str
    let first = s.chars().next().unwrap();
    println!("{}", first);
}

n番目の文字を取得する

イテレーターメソッドnthを使うと、位置を指定して文字を取得できます。Optionを返します。

fn main() {
    let s = "abcdef";
    let third = s.chars().nth(2);
    println!("{:?}", third);
}

バイトを反復処理する

生のバイトが本当に必要な場合は、u8の値を生成するbytes()を使います。

fn main() {
    let s = "AB";
    for b in s.bytes() {
        println!("{}", b);
    }
}

バイト境界でスライスする

文字列スライスではバイトインデックスを使います。スライスの境界は有効な文字境界上になければならず、そうでない場合はプログラムがパニックします。

fn main() {
    let s = "hello";
    let part = &s[0..3]; // valid ASCII boundary
    println!("{}", part);
}

charのメソッド

char型には、is_alphabetic、is_numeric、to_uppercaseなどの便利なメソッドがあります。

fn main() {
    let c = 'k';
    println!("alpha {} numeric {}", c.is_alphabetic(), c.is_numeric());
    println!("upper {}", c.to_uppercase());
}

特定の文字を数える

charsとfilterを組み合わせると、条件に一致する文字を数えられます。

fn main() {
    let s = "banana";
    let a_count = s.chars().filter(|&c| c == 'a').count();
    println!("a appears {} times", a_count);
}

簡単な確認

文字列の長さが予想外になることがある理由を思い出してください。

まとめ

RustのUTF-8とchar:

  • 文字列はUTF-8で、文字は1〜4バイトを使います。
  • len()はバイト数を、chars().count()は文字数を返します。
  • 文字列に数値でインデックス指定はできません。chars()またはnthを使います。
  • スライスの境界は文字境界上になければなりません。
fn main() {
    let s = "sm\u{ee}le";
    println!("bytes {} chars {}", s.len(), s.chars().count());
    for c in s.chars() {
        print!("{} ", c);
    }
    println!();
}
無料で開始

AI チューターと学ぶ Rust — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
39
レッスン
144

よくある質問

「UTF-8とChars」レッスンは無料ですか?

はい。「UTF-8とChars」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。

「UTF-8とChars」で何を学びますか?

Unicodeの扱い ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn Rust Codingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「UTF-8とChars」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn Rust Codingレッスンでコードを書いて実行できますか?

はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Stringと&strの違い
  2. スライス
  3. Stringのメソッド
  4. UTF-8とChars
← Learn Rust Codingに戻る