0

のコンテンツを取得する必要があります。.jsp使用していますstd::fs::read_to_string

if f.file_name() == "entry.jsp" {
    // read_file(f.path().to_str().unwrap());
    println!("{:?}", f.file_name());
    let contents = fs::read_to_string(f.path()).expect("Something went wrong reading the file");
}

しかし、次のエラーが発生しました:

「ストリームに有効な UTF-8 が含まれていませんでした」

ファイルを1行ずつ読み取ろうとしましstd::io::BufReaderたが、行を文字列として取得する方法がわかりません。

fn read_file(path: &str) -> std::io::Result<()> {
    let file = File::open(path)?;
    let reader = BufReader::new(file);
    for line in reader.lines() {
        println!("{}", line?);
    }
    Ok(())
}

どうすればコンテンツを として取得できStringますか?

ありがとう。

4

1 に答える 1

3

Rust の文字列は UTF-8 である必要があるため、正確な内容をString. あなたができることは、ファイルをバイトとして(たとえば でread_to_end)読み込んでから、 でバイトを文字列に変換することfrom_utf8_lossyです。

if f.file_name() == "entry.jsp" {
    // read_file(f.path().to_str().unwrap());
    println!("{:?}", f.file_name());
    let file = File::open(path)?;
    let mut buf = vec![];
    file.read_to_end (&mut buf)?;
    let contents = String::from_utf8_lossy (&buf);
}

ただし、名前の「ロッシ​​ー」部分が示すように、取得する文字列はファイルの内容とは異なることに注意してください。

ただし、すべてのバイト スライスが有効な文字列であるとは限りません。文字列は有効な UTF-8 である必要があります。この変換中に、from_utf8_lossy()は無効な UTF-8 シーケンスU+FFFD REPLACEMENT CHARACTERを次のような に置き換えます: �</p>

入力に ​​UTF-8 以外の有効な文字エンコーディングが使用されていることがわかっている場合は、他の解決策があります。

  • from_utf16ファイルが UTF-16 (または UCS-2) エンコーディングを使用している場合。
  • 他の文字エンコーディング用のencoding_rsまたはクレート。encoding
于 2020-04-15T06:16:12.767 に答える