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

时间:2017-03-30 15:36:52

标签: utf-8 stream 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;
}

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

  

stream不包含有效的UTF-8

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

2 个答案:

答案 0 :(得分:7)

documentation for String将其描述为:

  

UTF-8编码,可增长的字符串。

Wikipedia definition of UTF-8将为您提供大量有关背景的背景信息。简短版本是计算机使用称为byte的单位来表示数据。不幸的是,用字节表示的这些数据块没有内在含义;必须从外面提供。 UTF-8是解释字节序列的一种方式,文件格式如JPEG也是如此。

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

要修复它,不应使用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
}

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

答案 1 :(得分:-1)

如果您在 Windows 上读取非二进制文件(如配置文件等)时遇到错误。这可能是因为窗口中的 Type 属性。 enter image description here

确保类型设置为文件而不是文本文档。 黄色标记的文件扩展名可以使用,但绿色标记的文件扩展名会引发上述错误。