首页 > 解决方案 > 如果文件不包含有效的 UTF-8,我如何获取文件的内容

问题描述

我需要获取 a 的内容.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”

我尝试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?

谢谢。

标签: rust

解决方案


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 之外的一些有效字符编码,还有其他解决方案:


推荐阅读