Rust는 기본적으로 UTF-8 중심으로 문자열을 처리한다1. 그러나 MS-Windows는 euc-kr을 확장한 CP949(MS949)와 Unicode로 한글을 처리하므로2 MS-Windows에서는 영문, 숫자와 별개로 한글을 byte 단위로 처리할 때 2byte 또는 3byte의 문자가 혼재할 수 있다. 아래의 예제는 2byte (AnsiString) 한글만으로 Hex를 encode, decode 필요가 있을 때 참고할 만한 소스이다.
[dependencies]
encoding = "0.2.33"
hex = "0.4.2"
main.rs
use encoding::{label::encoding_from_whatwg_label, EncoderTrap, DecoderTrap};
use hex;
fn main() {
let kor_eng_num = String::from("가나다 ABC 123");
println!("{}", kor_eng_num);
println!("---------------------");
let mut vec = Vec::new();
let string_list = kor_eng_num.split_whitespace();
for s in string_list {
println!("UTF8: {} / MS949: {}", hex::encode(s).to_uppercase(), split_hex(s.into()));
vec.push(split_hex(s.into())); // s.into() -> &s
}
println!("---------------------");
for hex_str in vec.iter() {
println!("{} : {}", hex_str, hex2str(hex_str));
}
}
fn hex2str(s: &str) -> &str {
let euckr = encoding_from_whatwg_label("euc-kr").unwrap();
let decode_string = euckr.decode(&hex::decode(s).unwrap(), DecoderTrap::Replace).unwrap();
return string_to_static_str(decode_string);
}
fn split_hex(s: &str) -> &str { //&str -> String
let euckr = encoding_from_whatwg_label("euc-kr").unwrap();
//println!("{} / {:?}", euckr.name(), euckr.whatwg_name());
let encode_string = euckr.encode(&s, EncoderTrap::Replace).unwrap();
let hex_encode_string = hex::encode(encode_string).to_uppercase();
return string_to_static_str(hex_encode_string);
}
fn string_to_static_str(s: String) -> &'static str {
Box::leak(s.into_boxed_str())
}
/* 출력결과
가나다 ABC 123
---------------------
UTF8: EAB080EB8298EB8BA4 / MS949: B0A1B3AAB4D9
UTF8: 414243 / MS949: 414243
UTF8: 313233 / MS949: 313233
---------------------
B0A1B3AAB4D9 : 가나다
414243 : ABC
313233 : 123
*/