Into the Horizon

programming, photography, and daily log

wstring,string,wchar,char間の変換(C++)

再びc++での文字列処理の話。
c++めんどい(´・ω・`)

(2013/12/28)
長らく放置してましたが、結構アクセス数多いので追記。
wstring使うより、pficommonというライブラリをいれてustringを使うのをオススメします。stringを使うのと何も変わらず使えるので。
pficommonは他にも色々便利なので、ぜひ入れてみて下さい。
pficommon : http://pfi.github.io/pficommon/


■wchar <-> charの変換
mbstowcs, wcstombsを使う。

wchar_t *wc;
const char c[] = "あいうえお";
mbstowcs(wc, c, sizeof(c));

■char <-> stringの変換
string -> char* : c_str()を使う。
char* -> string : = で変換可能

string str;
const char *c = str.c_str();
string str2 = c; //※cが空だと、この書き方はsegmentation faultになるので注意!

■string <-> wstringの変換
んー(´・ω・`)
この方のモジュールを使用しました
http://d.hatena.ne.jp/kryozahiro/20080809/1218295912


■まとめ(wstringをmecabにつっこむ)
やりたかったのは、wstring型の文字列を、mecabに突っ込む(引数はchar型、結果もchar)の後に、結果をstring型に変換、という操作でした。

int main (int argc, char **argv) {
	setlocale( LC_CTYPE, "ja_JP.UTF-8");

	wstring inputwstr = L"太郎は次郎が持っている本を花子に渡した。";
	const wchar_t *inputw =inputwstr.c_str();
	char input[1024];
	wcstombs(input, inputw, sizeof(wchar_t)*int(inputwstr.size()));
	std::cout << "INPUT: " << input << std::endl;

	MeCab::Tagger *tagger = MeCab::createTagger("");
	const char *result = tagger->parse(input);
	string resultstr = result;
	std::cout << "RESULT: " << resultstr << std::endl;
	delete tagger;
	return 0;
}

これでokです。


これで文字列で困る事はなくなった…ような。