Help us understand the problem. What is going on with this article?

Rustでバイト列から文字列へ

More than 1 year has passed since last update.

Rustでバイト列から文字列へ

自分用にメモ。
文字列からu8スライス、u8スライスから文字列への変換。

fn main() {
    let test: &str = "Test";
    let bytes: &[u8] = test.as_bytes();
// convert bytes => str
    let res = bytes.iter().map(|&s| s as char).collect::<String>();
    let converted: String = String::from_utf8(bytes.to_vec()).unwrap();

    println!("{}", test);
    println!("{}", converted);
}

追記

コメントにて指摘されたことを追記。

Vecに変換するとVecを生成してしまい若干非効率になる。イテレータを取得しmapすることでそれを避けられる。
ただしくはUTF-8の文字列としてバリデーションをするのと、一文字として変換するのとの差になっているそうです。
ただし、Rustでは文字はUTF-8として変換されるため、マルチバイト文字であった場合元の文字列とは異なってしまう。

String::from_utf8はきちんとUTF-8のバイト列として解釈して変換してくれるので、マルチバイト文字でも正しく変換できる。
@blackenedgoldさんが検証して下さった結果によると、たしかに最適化無しの状態では2倍の差が出ていることが確認できる。
最適化した場合での差はそれほど大きくないのでString::from_utf8を使う方が良さそう。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away