在创建新结构之前,对附加unicode转义进行Rust处理



我正在读取一个文件,然后根据这些值创建一个结构。

let file = File::open(self.get_state_name().add(".sky")).unwrap();
let reader = BufReader::new(file);
for (_, line) in reader.lines().enumerate() {
let line = line.unwrap();
let key_value = line.split("`").collect::<Vec<&str>>();
let key = key_value[0].to_string();
let data = key_value[1].to_string();
self.set(key, data);
}

Set函数创建一个名为model 的新结构

let model = Model::new(key, data);

新函数只返回一个名为model的结构:

pub fn new(key: String, data: String) -> Model {
Model { key, data }
}

键的值以unicode转义符为前缀,如:

Model {
key: "u{f}u{0}u{0}u{0}u{0}u{0}u{0}u{0}Test",
data: "Test Data",
},

更新:尝试只保存ascii字符:

pub fn new(key: String, data: String) -> Model {
let key = key.replace(|c: char| !c.is_ascii(), "");
println!("Key: {}", key);
Model { key, data }
}

更新:保存文件

let mut file = File::create(name.add(".sky")).unwrap();
for i in &data {
let data = i.to_string();
let bytes = bincode::serialize(&data).unwrap();
file.write_all(&bytes).expect("Unable to write to file");
}

结构上的.to_string()方法

pub(crate) fn to_string(&self) -> String {
format!("{}`{}n", self.key, self.data)
}

这是没有unicode转义的密钥。它发生在Model { key, data }线路期间。

当直接设置值而不是从文件中读取时,不会发生同样的情况。如何消除这种情况,为什么会发生这种情况?

您使用bincode::serialize编写代码,但不是使用bincode::deserialize而是使用BufReader读取数据。

为了以二进制方式正确地序列化字符串,编码器添加了有关其存储的数据的附加信息。

如果您知道只处理与BufReader#lines兼容的字符串,那么在将其写入文件时也可以使用String#as_bytes。请注意,这将导致某些输入出现问题,尤其是换行符和其他输入。

最新更新