use std::borrow::Cow;
use encoding::all::{GB18030, GBK, UTF_8, KOI8_R};
use encoding::{DecoderTrap, EncoderTrap, Encoding};
use encoding_rs::{BIG5, EUC_KR};
use textcode::gb2312;
pub fn code_to_utf8(mut code: &str, data: Vec<u8>) -> String {
if data.is_empty() {
return "".to_string();
}
if code.is_empty() {
code = "utf8";
}
match code.to_lowercase().as_str() {
"utf8" | "utf-8" => {
match from_utf8(data.clone()) {
Ok(e) => e,
Err(_) => {
code_to_utf8("gbk", data.clone())
}
}
}
"gbk" => {
match gbk_to_utf8(data.clone()) {
Ok(e) => e,
Err(_) => {
code_to_utf8("gb18030", data.clone())
}
}
}
"gb18030" => match gb18030_to_utf8(data.clone()) {
Ok(e) => e,
Err(_) => {
code_to_utf8("gb2312", data.clone())
}
},
"gb2312" => gb2312_to_utf8(data.clone()),
"big5" => big5_to_utf8(data.clone()),
"iso-8859-1" => iso_8859_1_to_utf8(data.clone()),
"iso-8859-2" => iso_8859_2_to_utf8(data.clone()),
"iso-8859-3" => iso_8859_3_to_utf8(data.clone()),
"iso-8859-4" => iso_8859_4_to_utf8(data.clone()),
"iso-8859-5" => iso_8859_5_to_utf8(data.clone()),
"iso-8859-6" => iso_8859_6_to_utf8(data.clone()),
"iso-8859-7" => iso_8859_7_to_utf8(data.clone()),
"iso-8859-8" => iso_8859_8_to_utf8(data.clone()),
"iso-8859-9" => iso_8859_9_to_utf8(data.clone()),
"iso-8859-10" => iso_8859_10_to_utf8(data.clone()),
"iso-8859-11" => iso_8859_11_to_utf8(data.clone()),
"iso-8859-13" => iso_8859_13_to_utf8(data.clone()),
"iso-8859-14" => iso_8859_14_to_utf8(data.clone()),
"iso-8859-15" => iso_8859_15_to_utf8(data.clone()),
"iso-8859-16" => iso_8859_16_to_utf8(data.clone()),
"iso-6937" => iso_6937_to_utf8(data.clone()),
"koi8-r" => koi8r_to_utf8(data.clone()),
"euc-kr" => euc_kr_to_utf8(data.clone()),
_ => from_utf8(data.clone()).unwrap_or("".to_string()),
}
}
pub fn gbk_to_utf8(data: Vec<u8>) -> Result<String, Cow<'static, str>> {
GBK.decode(&data, DecoderTrap::Strict)
}
pub fn to_gbk(str: &str) -> Vec<u8> {
GBK.encode(str, EncoderTrap::Strict).unwrap()
}
pub fn from_utf8(data: Vec<u8>) -> Result<String, Cow<'static, str>> {
UTF_8.decode(&data, DecoderTrap::Strict)
}
pub fn to_utf8(str: &str) -> Vec<u8> {
UTF_8.encode(str, EncoderTrap::Strict).unwrap()
}
pub fn gb18030_to_utf8(data: Vec<u8>) -> Result<String, Cow<'static, str>> {
GB18030.decode(&data, DecoderTrap::Strict)
}
pub fn to_gb18030(str: &str) -> Vec<u8> {
GB18030.encode(str, EncoderTrap::Strict).unwrap()
}
pub fn gb2312_to_utf8(data: Vec<u8>) -> String {
gb2312::decode_to_string(&data)
}
pub fn to_gb2312(str: &str) -> Vec<u8> {
gb2312::encode_to_vec(str)
}
pub fn iso_8859_1_to_utf8(data: Vec<u8>) -> String {
textcode::iso8859_1::decode_to_string(&data)
}
pub fn iso_8859_2_to_utf8(data: Vec<u8>) -> String {
textcode::iso8859_2::decode_to_string(&data)
}
pub fn iso_8859_3_to_utf8(data: Vec<u8>) -> String {
textcode::iso8859_3::decode_to_string(&data)
}
pub fn iso_8859_4_to_utf8(data: Vec<u8>) -> String {
textcode::iso8859_4::decode_to_string(&data)
}
pub fn iso_8859_5_to_utf8(data: Vec<u8>) -> String {
textcode::iso8859_5::decode_to_string(&data)
}
pub fn iso_8859_6_to_utf8(data: Vec<u8>) -> String {
textcode::iso8859_6::decode_to_string(&data)
}
pub fn iso_8859_7_to_utf8(data: Vec<u8>) -> String {
textcode::iso8859_7::decode_to_string(&data)
}
pub fn iso_8859_8_to_utf8(data: Vec<u8>) -> String {
textcode::iso8859_8::decode_to_string(&data)
}
pub fn iso_8859_9_to_utf8(data: Vec<u8>) -> String {
textcode::iso8859_9::decode_to_string(&data)
}
pub fn iso_8859_10_to_utf8(data: Vec<u8>) -> String {
textcode::iso8859_10::decode_to_string(&data)
}
pub fn iso_8859_11_to_utf8(data: Vec<u8>) -> String {
textcode::iso8859_11::decode_to_string(&data)
}
pub fn iso_8859_13_to_utf8(data: Vec<u8>) -> String {
textcode::iso8859_13::decode_to_string(&data)
}
pub fn iso_8859_14_to_utf8(data: Vec<u8>) -> String {
textcode::iso8859_14::decode_to_string(&data)
}
pub fn iso_8859_15_to_utf8(data: Vec<u8>) -> String {
textcode::iso8859_15::decode_to_string(&data)
}
pub fn iso_8859_16_to_utf8(data: Vec<u8>) -> String {
textcode::iso8859_16::decode_to_string(&data)
}
pub fn iso_6937_to_utf8(data: Vec<u8>) -> String {
textcode::iso6937::decode_to_string(&data)
}
pub fn big5_to_utf8(data: Vec<u8>) -> String {
let (cow, _, _) = BIG5.decode(&data);
cow.into_owned()
}
pub fn koi8r_to_utf8(data: Vec<u8>) -> String {
KOI8_R.decode(&data, DecoderTrap::Strict).unwrap()
}
pub fn euc_kr_to_utf8(data: Vec<u8>) -> String {
let (decoded_str, _, _) = EUC_KR.decode(data.as_slice());
match decoded_str {
Cow::Borrowed(s) => s.to_string(),
Cow::Owned(s) => s,
}
}
use urlencoding::{decode, encode};
pub fn urlencoding_decode(str: &str) -> String {
decode(str).unwrap_or(Cow::from(str)).to_string()
}
pub fn urlencoding_encode(str: &str) -> String {
encode(str).to_string()
}