最近nkfをいろいろ触っている。nkf_charはtypedefで定められたint型の別名である。
nkf_charはShift_JISなら2ついるし、UTF-8なら3ついるかもしれない。
それをC++のstd::stringとかstd::wstringとかwxStringに変換できないかなあと思ってた。つまりは可変長の配列にぶち込んでぐりぐりと弄りたい。
//============================================================================ // Name : Oconv.cpp // Author : Nantona-ku Shiawase //============================================================================ #ifdef nkf_char #elif defined(INT_IS_SHORT) typedef long nkf_char; #define NKF_INT32_C(n) (n##L) #else typedef int nkf_char; #define NKF_INT32_C(n) (n) #endif using namespace std; #include <wchar.h> #include <iostream> #include <vector> #include <wx/wx.h> int main(int argc, char **argv) { // 例によって出力は「阿Q正伝」 UTF-8型のバイナリ配列 nkf_char str[] = { 233, 152, 191, 239, 188, 177, 230, 173, 163, 228, 188, 157 }; wstring c1; for (int i = 0; i < 12; i++) { c1.push_back(str[i]); } // localeを定めるときVC++なら "japanese"で通る // mingwの場合japaneseだと実行時エラー wcout.imbue(locale("")); wcout << c1 << endl; // wx-2.9からは「wxString c2(c1)」でも通るらしい wchar_t* wc = (wchar_t*)c1.c_str(); wxString c2(wc); wcout << c2 << endl; return 0; }
こんな方法もある
std::vector<char> data; const char str[] = { 233, 152, 191, 239, 188, 177, 230, 173, 163, 228, 188, 157 }; const size_t strlen = sizeof str / sizeof str[0]; for (unsigned int i=0;i<strlen;i++) { data.push_back(str[i]); } wxString show = wxString::FromUTF8(&data[0], strlen); wxMessageBox(show);