iconv を使用した方法
std::string SJIS_to_UTF8 (const std::string& sj_str) { tstring u8_str ; iconv_t icd = ::iconv_open("UTF8","Shift_JIS") ; if (icd == (iconv_t)-1) { u8_str = ::iconv_SJIS_UTF8(sj_str) ; } else { { size_t sj_size = sj_str.length() ; size_t u8_size = sj_str.length()*3 + 1024 ; u8_str.resize(u8_size) ; char* sj_ptr = (char*)(&sj_str[0]) ; char* u8_ptr = (char*)(&u8_str[0]) ; ::iconv(icd,&sj_ptr,&sj_size,&u8_ptr,&u8_size) ; } ::iconv_close(icd) ; } return u8_str.c_str() ; }
iconv,uconv の部分
#define cmd_iconv _T("iconv") // linux #define cmd_uconv _T("uconv") // DS116 bool exec_x_conv (const tstring& s_j_name,const tstring& u_8_name) { tstring sj_name = ::QuotM_Add_Auto(s_j_name) ; tstring u8_name = ::QuotM_Add_Auto(u_8_name) ; tstring param = _T(" -f sjis -t utf8 ") + sj_name + _T(" -o ") + u8_name ; if (::which( cmd_iconv)) { tstring exe_iconv = cmd_iconv _T(" ") + param ; _tsystem(exe_iconv.c_str()) ; return true ; } if (::which( cmd_uconv)) { tstring exe_uconv = cmd_uconv _T(" ") + param ; _tsystem(exe_uconv.c_str()) ; return true ; } return false ; } std::string iconv_SJIS_UTF8(const std::string& sj_str) { tstring tmp_path = ::Get_i_Tools_tmp_date() ; tstring now_str = ::Now_Format(_T("%M%S")) ; tstring s_j_name = ::Path_AddLastSP(tmp_path) + _T("sj_") + now_str + _T(".txt") ; tstring u_8_name = ::Path_AddLastSP(tmp_path) + _T("u8_") + now_str + _T(".txt") ; s_j_name = ::CreateUniqueEmpty(s_j_name.c_str()) ; u_8_name = ::CreateUniqueEmpty(u_8_name.c_str()) ; std::string u8_str ; { v_char v_c_u8 ; v_char v_c_sj = ::To_v_char(sj_str.c_str()) ; ::v_c_SaveText(s_j_name.c_str(),v_c_sj) ; { ::exec_x_conv(s_j_name,u_8_name) ; } v_c_u8 = ::v_c_Load (u_8_name.c_str()) ; u8_str = ::To_tstring( v_c_u8 ).c_str() ; } return u8_str.c_str() ; }
うまく置き換わっていない文字があった.
‘~'(0x7e) が ‘‾'(0x203e) になってしまっていた.
他にも ‘\'(0x5c) が ‘¥'(0xa5) .
http://ossforum.jp/jossfiles/Linux_SJIS_Support.pdf
幾つか違う文字があるようで,iconv の -f sjis を SJIS-WIN でうまくいった.
tstring i_param = _T(" -f SJIS-WIN -t utf8 ") + sj_name + _T(" -o ") + u8_name ; tstring u_param = _T(" -f sjis -t utf8 ") + sj_name + _T(" -o ") + u8_name ;
2020/04/30 ASUSTOR NAS に対応
text_gnc.hxx exec_ic.hxx
[…] Linux 文字コード変換のコード […]