Skip to main content

package_parser/pkgs/common/
mod.rs

1use anyhow::{anyhow, Result};
2
3pub mod model;
4
5pub fn decode_string(buffer: &[u8]) -> Result<String> {
6    let mut failed_encodings = vec![];
7
8    let (s, _, has_error) = encoding_rs::UTF_8.decode(buffer);
9    if has_error {
10        failed_encodings.push("UTF-8");
11    } else {
12        return Ok(s.to_string());
13    }
14
15    let (s, _, has_error) = encoding_rs::UTF_16LE.decode(buffer);
16    if has_error {
17        failed_encodings.push("UTF-16LE");
18    } else {
19        log::warn!("UTF-16LE encoding detected. This is not recommended.");
20        return Ok(s.to_string());
21    }
22
23    let (s, _, has_error) = encoding_rs::UTF_16BE.decode(buffer);
24    if has_error {
25        failed_encodings.push("UTF-16BE");
26    } else {
27        log::warn!("UTF-16BE encoding detected. This is not recommended.");
28        return Ok(s.to_string());
29    }
30
31    let (s, _, has_error) = encoding_rs::GB18030.decode(buffer);
32    if has_error {
33        failed_encodings.push("GB18030");
34    } else {
35        log::warn!("GB18030 encoding detected. This is not recommended.");
36        return Ok(s.to_string());
37    }
38
39    let (s, _, has_error) = encoding_rs::SHIFT_JIS.decode(buffer);
40    if has_error {
41        failed_encodings.push("SHIFT-JIS");
42    } else {
43        log::warn!("SHIFT-JIS encoding detected. This is not recommended.");
44        return Ok(s.to_string());
45    }
46
47    Err(anyhow!(
48        "Failed to decode string. Tried encodings: {}",
49        failed_encodings.join(", ")
50    ))
51}