	std::wstring widen(std::string const& src)
	{	
		typedef std::codecvt<wchar_t, char, std::mbstate_t> convert;
		
		const convert& cvt = std::use_facet<convert>(std::locale(""));
		convert::result res;
		std::mbstate_t state;
		
		const char *src_next = 0;
		wchar_t *wcs = new wchar_t[src.length() + 1];
		wchar_t *wcs_next = 0;
		std::wstring ret;
		
		res = cvt.in(state, src.data(), src.data() + src.size(), src_next, 
				wcs, wcs + sizeof(wchar_t) * (src.length() + 1), wcs_next
		);
		
		// big endian
		if (res == convert::ok) {
			std::wstring ret(wcs, wcs_next);
			
			for (auto it = ret.begin(), end = ret.end(); it != end; ++it) {
				std::reverse(reinterpret_cast<unsigned wchar_t>(*it), sizeof(unsigned wchar_t));
			}
			return ret;
		}
		
		
		// fail
		return std::wstring();
	}