なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

単純なint型の集合をstring型に

最近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);