#include <iostream>
#include <fstream>
#include <codecvt>
#include <algorithm>
//VC only.
bool ReadStringFromFile(const std::string& FName, std::wstring& R) {
std::wifstream fs;
std::codecvt_utf8_utf16<wchar_t, 0x10ffff, std::consume_header> Cnv;
//auto OL = fs.imbue(std::locale(std::locale::empty(), new std::codecvt_utf8_utf16<wchar_t, 0x10ffff, std::consume_header>()));
auto OL = fs.imbue(std::locale("japanese"));
//static_assert(sizeof(wchar_t) == 2, "this is only for windows.");//Linuxではつかうcvt違うから直してくれ
fs.open(FName);
if (!fs) {
std::cout << "can't open file." << std::endl;
return false;
}
auto b = std::istreambuf_iterator<std::wistream::char_type>(fs);
auto e = std::istreambuf_iterator<std::wistream::char_type>();
R = std::wstring(b, e);
fs.imbue(OL);
return true;;
}
int main() {
std::wstring S;
auto B = std::wcout.imbue(std::locale("japanese"));
if (!ReadStringFromFile((__FILE__), S)) {
return -1;
}
std::wcout << S << std::endl;
std::wcout <<L"------------" << std::endl;
std::reverse(S.begin(), S.end());
std::wcout << S << std::endl;
std::wcout.imbue(B);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPGNvZGVjdnQ+CiNpbmNsdWRlIDxhbGdvcml0aG0+CgovL1ZDIG9ubHkuCgpib29sIFJlYWRTdHJpbmdGcm9tRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgRk5hbWUsIHN0ZDo6d3N0cmluZyYgUikgewoJc3RkOjp3aWZzdHJlYW0gZnM7CglzdGQ6OmNvZGVjdnRfdXRmOF91dGYxNjx3Y2hhcl90LCAweDEwZmZmZiwgc3RkOjpjb25zdW1lX2hlYWRlcj4gQ252OwoJLy9hdXRvIE9MID0gZnMuaW1idWUoc3RkOjpsb2NhbGUoc3RkOjpsb2NhbGU6OmVtcHR5KCksIG5ldyBzdGQ6OmNvZGVjdnRfdXRmOF91dGYxNjx3Y2hhcl90LCAweDEwZmZmZiwgc3RkOjpjb25zdW1lX2hlYWRlcj4oKSkpOwoJYXV0byBPTCA9IGZzLmltYnVlKHN0ZDo6bG9jYWxlKCJqYXBhbmVzZSIpKTsKCS8vc3RhdGljX2Fzc2VydChzaXplb2Yod2NoYXJfdCkgPT0gMiwgInRoaXMgaXMgb25seSBmb3Igd2luZG93cy4iKTsvL0xpbnV444Gn44Gv44Gk44GL44GGY3Z06YGV44GG44GL44KJ55u044GX44Gm44GP44KMCgoJZnMub3BlbihGTmFtZSk7CgoJaWYgKCFmcykgewoJCXN0ZDo6Y291dCA8PCAiY2FuJ3Qgb3BlbiBmaWxlLiIgPDwgc3RkOjplbmRsOwoJCXJldHVybiBmYWxzZTsKCX0KCWF1dG8gYiA9IHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxzdGQ6Ondpc3RyZWFtOjpjaGFyX3R5cGU+KGZzKTsKCWF1dG8gZSA9IHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxzdGQ6Ondpc3RyZWFtOjpjaGFyX3R5cGU+KCk7CglSID0gc3RkOjp3c3RyaW5nKGIsIGUpOwoKCWZzLmltYnVlKE9MKTsKCXJldHVybiB0cnVlOzsKfQppbnQgbWFpbigpIHsKCXN0ZDo6d3N0cmluZyBTOwoJYXV0byBCID0gc3RkOjp3Y291dC5pbWJ1ZShzdGQ6OmxvY2FsZSgiamFwYW5lc2UiKSk7CglpZiAoIVJlYWRTdHJpbmdGcm9tRmlsZSgoX19GSUxFX18pLCBTKSkgewoJCXJldHVybiAtMTsKCX0KCXN0ZDo6d2NvdXQgPDwgUyA8PCBzdGQ6OmVuZGw7CglzdGQ6Ondjb3V0IDw8TCItLS0tLS0tLS0tLS0iIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6cmV2ZXJzZShTLmJlZ2luKCksIFMuZW5kKCkpOwoJCglzdGQ6Ondjb3V0IDw8IFMgPDwgc3RkOjplbmRsOwoKCXN0ZDo6d2NvdXQuaW1idWUoQik7CgoJcmV0dXJuIDA7Cn0=