package_parser/pkgs/common/
mod.rs1use 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}