use encoding_rs::Encoding;

pub fn cxx_string_to_string(s: &cxx::CxxString) -> String {
    match s.to_str() {
        Ok(s) => return s.to_string(),
        Err(_) => {}
    };

    // 不是UTF-8，尝试转换
    let candidates = [
        "gb18030",      // 覆盖 GBK/GB2312 的常见场景
        "windows-1252", // 西欧常见
        "shift_jis",    // 日文常见
        "big5",         // 繁体中文常见
    ];

    let bytes = s.as_bytes();

    for label in candidates {
        let enc = Encoding::for_label(label.as_bytes()).unwrap();
        let (cow, _actual_used, had_errors) = enc.decode(bytes);
        if !had_errors {
            return cow.into_owned();
        }
    }

    // 编码全部没有命中的话，则丢弃无法解析的部分
    s.to_string_lossy().into_owned()
}