mmd_anim_format/
normalize.rs1use encoding_rs::SHIFT_JIS;
2
3pub fn normalize_vmd_name(bytes: &[u8]) -> Vec<u8> {
4 let end = bytes.iter().position(|&b| b == 0).unwrap_or(bytes.len());
5 let (decoded, _encoding, _had_errors) = SHIFT_JIS.decode(&bytes[..end]);
6 decoded.as_bytes().to_vec()
7}
8
9#[cfg(test)]
10mod tests {
11 use super::*;
12
13 #[test]
14 fn ascii_name_preserved() {
15 assert_eq!(normalize_vmd_name(b"BoneA"), b"BoneA".to_vec());
16 }
17
18 #[test]
19 fn japanese_name_decoded_to_utf8() {
20 let sjis: &[u8] = &[0x83, 0x65, 0x83, 0x58, 0x83, 0x67];
21 let utf8: &[u8] = &[0xE3, 0x83, 0x86, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88];
22 assert_eq!(normalize_vmd_name(sjis), utf8.to_vec());
23 }
24
25 #[test]
26 fn empty_name_stays_empty() {
27 assert_eq!(normalize_vmd_name(b""), b"".to_vec());
28 }
29
30 #[test]
31 fn trailing_nul_is_trimmed() {
32 assert_eq!(normalize_vmd_name(b"BoneA\0\0"), b"BoneA".to_vec());
33 }
34}