私が特定のエンコーディングを想定できない場合、私が通常行う方法はstd::ascii::escape_default
の機能です。基本的には、ほとんどのASCII文字がそのまま表示され、それ以外はすべてエスケープされます。
use std::ascii::escape_default;
use std::str;
fn show(bs: &[u8]) -> String {
let mut visible = String::new();
for &b in bs {
let part: Vec<u8> = escape_default(b).collect();
visible.push_str(str::from_utf8(&part).unwrap());
}
visible
}
fn main() {
let bytes = b"foo\xE2\x98\x83bar\xFFbaz";
println!("{}", show(bytes));
}
出力:foo\xe2\x98\x83bar\xffbaz
別のアプローチの欠点は、あなたがあなたの厳格の部分が正しいUTF-8ですが、それはほとんどの用途のために仕事をしていません場合でも、可能なすべてのUnicodeコードポイントが表示されないということです内容を文字列に不可逆にデコードして印刷することです。無効なUTF-8があります場合は、代わりに生のバイトの進エスケープのUnicodeの置換文字を取得しますが、あなたはすべての有効なUTF-8エンコードされたUnicodeコードポイント見るようになるだろう:
fn show(bs: &[u8]) -> String {
String::from_utf8_lossy(bs).into_owned()
}
fn main() {
let bytes = b"foo\xE2\x98\x83bar\xFFbaz";
println!("{}", show(bytes));
}
出力:foo☃bar�baz
を
あなたはどのバイトエンコーディングを想定していますか?プレーン7ビットASCII? –
特定のエンコーディングを想定していないため、テキストはおそらくASCIIですが、必ずしもそうであるとは限りません。私はちょうどIdでstdoutにバイトを書いたかのように、ターミナルでそれを見たいと思います。悪いエンコーディングのために何か言い伝えがある場合、OKです。 – ideasman42
特定のエンコーディングを引き受けることができないとの質問に変更する必要があります。あなたがUTF-8を想定することができれば、その 'str :: from_utf8'が最良の方法です。それ以外の場合、 'str :: from_utf8'は無効なUTF-8なら失敗しますので、他の方法を使う必要があります。 – BurntSushi5