2017-01-03 1 views
1

println!("{:?}", some_u8_slice);を使用してRustにu8アレイを印刷すると、数値が(必要な数だけ)出力されます。特定のエンコーディングを気にしない場合、u8スライスをテキストとして印刷するにはどうすればいいですか?

文字をそのまま文字列 にフォーマットする最も直接的な方法は、特定のエンコーディングを想定することなくです。

バイト文字列を反復処理し、(あまり手間をかけずに)stdoutに各文字を書くような何か

これはRusts format!を使用して行うことができますか?

それ以外の場合、u8スライスを印刷する最も便利な方法は何ですか?

+1

あなたはどのバイトエンコーディングを想定していますか?プレーン7ビットASCII? –

+0

特定のエンコーディングを想定していないため、テキストはおそらくASCIIですが、必ずしもそうであるとは限りません。私はちょうどIdでstdoutにバイトを書いたかのように、ターミナルでそれを見たいと思います。悪いエンコーディングのために何か言い伝えがある場合、OKです。 – ideasman42

+1

特定のエンコーディングを引き受けることができないとの質問に変更する必要があります。あなたがUTF-8を想定することができれば、その 'str :: from_utf8'が最良の方法です。それ以外の場合、 'str :: from_utf8'は無効なUTF-8なら失敗しますので、他の方法を使う必要があります。 – BurntSushi5

答えて

5

私が特定のエンコーディングを想定できない場合、私が通常行う方法は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

6

最も簡単な方法はstdout().write_all(some_u8_slice)です。これは、エンコーディングに関係なくバイトを出力するだけです。これはバイナリデータ、または元のエンコーディングを保存したい未知のエンコーディングのテキストに役立ちます。

あなたはデータを文字列として扱いたいとあなたがエンコードがUTF-8(またはASCIIのようなUTF-8のサブセット)であることがわかっている場合、あなたはこれを行うことができます。

use std::str; 

fn main() { 
    let some_utf8_slice = &[104, 101, 0xFF, 108, 111]; 
    if let Ok(s) = str::from_utf8(some_utf8_slice) { 
     println!("{}", s); 
    } 
} 

これはチェックしますデータを印刷する前に有効なUTF-8であることを確認してください。

+0

参考になりましたが、これはまったく、または何もありません - RustにはPythonのsurrogateescape-python.org/dev/peps/pep-0383のようなものがありますか? - 別途質問: http://stackoverflow.com/questions/41455206 – ideasman42

+1

複数の人があなたの質問に答えました。あなたは他の答えを調べたいかもしれません。 – BurntSushi5

3

あなただけの生のバイトをシャベルにしたい場合は、出力は次その後、パイプまたはファイルにリダイレクトされている場合に特に便利です、stdoutにエスケープを解除作業を行う必要がありますが:

let out = std::io::stdout(); 
out.write_all(slice)?; 
out.flush()?; 

flushされます必需品write_allの直後にプログラムの終了が続くと、バイトを基礎となるファイル記述子に渡すことができません。

関連する問題