回答:
バイトのスライスを文字列のスライスに変換するには(UTF-8エンコーディングを想定):
use std::str;
//
// pub fn from_utf8(v: &[u8]) -> Result<&str, Utf8Error>
//
// Assuming buf: &[u8]
//
fn main() {
let buf = &[0x41u8, 0x41u8, 0x42u8];
let s = match str::from_utf8(buf) {
Ok(v) => v,
Err(e) => panic!("Invalid UTF-8 sequence: {}", e),
};
println!("result: {}", s);
}
変換はインプレースで行われ、割り当ては必要ありません。String
文字列スライスを呼び出すこと.to_owned()
で、必要に応じて文字列スライスからを作成できます(他のオプションも利用できます)。
変換関数のライブラリリファレンス:
from_utf8
割り当てられないことは事実ですが、utf-8の正確性を検証するためにデータをスキャンする必要があることは言及する価値があるかもしれません。したがって、これはO(1)操作ではありません(最初に考えるかもしれません)
fn main() {
let buf = &[0x41u8, 0x41u8, 0x42u8];
let s = String::from_utf8_lossy(buf);
println!("result: {}", s);
}
無効なUTF-8バイトを に変換するため、エラー処理は必要ありません。それはあなたがそれを必要とせず、私がほとんどそれを必要としない場合に適しています。あなたは実際にこれから得String
ます。それはあなたがサーバーから得ているものを少し簡単に出力するはずです。
into_owned()
書き込み時のクローンなので、メソッドを使用する必要がある場合があります。
into_owned()
提案ありがとうございました!まさに私が探していたのです(これによりString
、たとえば、メソッドからの戻り値として返すことができる適切なものになります)。
実際にバイトのベクトル(Vec<u8>
)があり、に変換したいString
場合、最も効率的なのは、次のように割り当てを再利用することString::from_utf8
です。
fn main() {
let bytes = vec![0x41, 0x42, 0x43];
let s = String::from_utf8(bytes).expect("Found invalid UTF-8");
println!("{}", s);
}
Vec
、しかし、新規参入者は違いを知りません。ただし、有用であることが判明したすべての質問と回答に必ず賛成票を投じてください。
String::from_utf8_lossy
に、ここでは代わりに使用でき、expect呼び出しは必要ありません。
String::from_utf8_lossy
ここでは代わりに使用できると思うかもしれませんが、expect
呼び出しは必要ありませんが、その入力はバイト(&'a [u8]
)のスライスです。OTOH、もありfrom_utf8_unchecked
ます。「あなたは、バイトスライスが有効なUTF-8であることを確信している、とあなたは、変換のオーバーヘッドが発生しない場合、この関数の危険なバージョンがある[ from_utf8_lossy]
、from_utf8_unchecked
、同じ動作を持っていますが、チェックをスキップしています。 」
&vec_of_bytes
の例に示すように、を使用してバイトのスライスに戻すことができることに注意してくださいfrom_utf8_lossy
。doc.rust-lang.org/std/string/...