我正在创建一个简单的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
它是什么意思以及如何解决它?
答案 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)