从 mp3 文件打印艺术家信息时为什么会出现“\u{0}”?
Why do I get '\u{0}' when printing artist info from an mp3 file?
我正在做一个项目,我收集 mp3 文件的元数据,我应该把它放在 MusicFile
结构中。我在尝试打印我的 Vec<MusicFile>
时遇到问题,我在输出中有:
artiste: "DORETDEPLATINE\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}",
DORETTDEPLATINE 是我的 mp3 标题 我不知道为什么会出现 \u{0}
。
我的扫描函数中的代码是:
pub fn scan(path: &Path) -> Vec<MusicFile> {
let mut music_files: Vec<MusicFile> = Vec::new();
let walker = WalkDir::new(path).into_iter();
for entry in walker {
let entry = match entry {
Ok(entry) => entry,
Err(_) => panic!("Probleme"),
};
if is_supported(&entry) {
let meta_music = mp3_metadata::read_from_file(entry.path()).expect("file err"); //convert an entry to path like 9
let meta_file = fs::metadata(entry.path()).expect("error");
//println!("la taille est {}",meta_file.len());
//println!("la date creat est {:?}",meta_file.created());//Date creation file
let mut artiste = String::new();
let mut year: u16 = Default::default();
let mut title = String::new();
let mut album = String::new();
if let Some(tag) = meta_music.tag {
artiste = tag.artist;
year = tag.year;
title = tag.title;
album = tag.album;
}
//println!("L'ALBUM EST {}",album);
music_files.push(MusicFile::new(
entry.path(),
artiste,
meta_file.len(),
year,
album,
title,
meta_file.created(),
));
}
}
music_files
}
我的 MusicFile
是:
use std::path::{Path, PathBuf};
use std::time::SystemTime;
#[derive(Debug)]
pub struct MusicFile {
path: PathBuf,
artiste: String,
taille: u64,
annee: u16,
album: String,
titre: String,
date_crea: Result<SystemTime, std::io::Error>,
}
impl MusicFile {
pub fn new(path: &Path, artiste: String, taille: u64, annee: u16, album: String, titre: String, date_crea: Result<SystemTime, std::io::Error>) -> MusicFile {
MusicFile {
path: path.to_path_buf(),
artiste: artiste,
taille: taille,
annee: annee,
album: album,
titre: titre,
date_crea: date_crea,
}
}
pub fn get_titre(&self) -> String {
self.titre.clone()
}
}
最后我的 main()
只打印从 scan()
返回的 Vec<MusicFile>
。
ID3 metadata tag uses a fixed-width field for the "artist"
info. It appears the mp3_metadata 板条箱简单地按原样读取整个字段,其中将包括空填充字节。
您可以使用 .trim_end_matches()
和 .to_owned()
删除这些填充字节:
artiste = tag.artist.trim_end_matches('[=10=]').to_owned();
查看它在 playground 上的工作情况。
我正在做一个项目,我收集 mp3 文件的元数据,我应该把它放在 MusicFile
结构中。我在尝试打印我的 Vec<MusicFile>
时遇到问题,我在输出中有:
artiste: "DORETDEPLATINE\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}",
DORETTDEPLATINE 是我的 mp3 标题 我不知道为什么会出现 \u{0}
。
我的扫描函数中的代码是:
pub fn scan(path: &Path) -> Vec<MusicFile> {
let mut music_files: Vec<MusicFile> = Vec::new();
let walker = WalkDir::new(path).into_iter();
for entry in walker {
let entry = match entry {
Ok(entry) => entry,
Err(_) => panic!("Probleme"),
};
if is_supported(&entry) {
let meta_music = mp3_metadata::read_from_file(entry.path()).expect("file err"); //convert an entry to path like 9
let meta_file = fs::metadata(entry.path()).expect("error");
//println!("la taille est {}",meta_file.len());
//println!("la date creat est {:?}",meta_file.created());//Date creation file
let mut artiste = String::new();
let mut year: u16 = Default::default();
let mut title = String::new();
let mut album = String::new();
if let Some(tag) = meta_music.tag {
artiste = tag.artist;
year = tag.year;
title = tag.title;
album = tag.album;
}
//println!("L'ALBUM EST {}",album);
music_files.push(MusicFile::new(
entry.path(),
artiste,
meta_file.len(),
year,
album,
title,
meta_file.created(),
));
}
}
music_files
}
我的 MusicFile
是:
use std::path::{Path, PathBuf};
use std::time::SystemTime;
#[derive(Debug)]
pub struct MusicFile {
path: PathBuf,
artiste: String,
taille: u64,
annee: u16,
album: String,
titre: String,
date_crea: Result<SystemTime, std::io::Error>,
}
impl MusicFile {
pub fn new(path: &Path, artiste: String, taille: u64, annee: u16, album: String, titre: String, date_crea: Result<SystemTime, std::io::Error>) -> MusicFile {
MusicFile {
path: path.to_path_buf(),
artiste: artiste,
taille: taille,
annee: annee,
album: album,
titre: titre,
date_crea: date_crea,
}
}
pub fn get_titre(&self) -> String {
self.titre.clone()
}
}
最后我的 main()
只打印从 scan()
返回的 Vec<MusicFile>
。
ID3 metadata tag uses a fixed-width field for the "artist"
info. It appears the mp3_metadata 板条箱简单地按原样读取整个字段,其中将包括空填充字节。
您可以使用 .trim_end_matches()
和 .to_owned()
删除这些填充字节:
artiste = tag.artist.trim_end_matches('[=10=]').to_owned();
查看它在 playground 上的工作情况。