"Stream不包含有效的UTF-8"是什么意思?

Sae*_* M. 3 stream utf-8 rust

我正在创建一个简单的HTTP服务器.我需要读取请求的图像并将其发送到浏览器.我正在使用此代码:

fn read_file(mut file_name: String) -> String {
    file_name = file_name.replace("/", "");
    if file_name.is_empty() {
        file_name = String::from("index.html");
    }

    let path = Path::new(&file_name);
    if !path.exists() {
        return String::from("Not Found!");
    }
    let mut file_content = String::new();
    let mut file = File::open(&file_name).expect("Unable to open file");
    let res = match file.read_to_string(&mut file_content) {
        Ok(content) => content,
        Err(why) => panic!("{}",why),
    };

    return file_content;
}
Run Code Online (Sandbox Code Playgroud)

如果请求的文件是基于文本的,则此方法有效,但是当我想要读取图像时,我收到以下消息:

流不包含有效的UTF-8

它是什么意思以及如何解决它?

She*_*ter 9

文档String将其描述为:

UTF-8编码,可扩展的字符串.

UTF-8的维基百科定义,会给你的背景上是一个多么伟大的交易.简短版本是计算机使用称为字节的单元来表示数据.不幸的是,用字节表示的这些数据块没有内在含义; 必须从外面提供.UTF-8是解释字节序列的一种方式,像JPEG这样的文件格式也是如此.

与大多数文本编码一样,UTF-8具有有效无效的特定要求和字节序列.您尝试加载的图像包含一系列不能解释为UTF-8字符串的字节; 这是错误消息告诉您的内容.


要修复它,您不应该使用a String来保存任意字节集合.在Rust中,这更好地代表了Vec:

fn read_file(mut file_name: String) -> Vec<u8> {
    file_name = file_name.replace("/", "");
    if file_name.is_empty() {
        file_name = String::from("index.html");
    }

    let path = Path::new(&file_name);
    if !path.exists() {
        return String::from("Not Found!").into();
    }
    let mut file_content = Vec::new();
    let mut file = File::open(&file_name).expect("Unable to open file");
    file.read_to_end(&mut file_content).expect("Unable to read");
    file_content
}
Run Code Online (Sandbox Code Playgroud)

为了传福音,这是Rust为什么语言很好的一个很好的方面.因为有一种类型代表"一组保证为有效UTF-8字符串的字节",所以我们可以编写更安全的程序,因为我们知道这个不变量永远都是真的.我们不必在整个程序中继续检查以"确保"它仍然是一个字符串.