从 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 上的工作情况。