读书人

:gethostbyname()不能在unicode环境下

发布时间: 2012-03-16 16:34:56 作者: rapoo

::gethostbyname()不能在unicode环境下使用怎么办?
恩 事情是这样的,在下最近在编写一个程序,需要在unicode环境下获得主机的IP地址,结果发现代码中::gethostbyname()这个函数不能通过编译,原因是这个函数的参数必须要使用char型的。

于是便想请教一下各位:

1)有什么别的API函数,能在unicode环境下较为简易地获得主机的IP地址吗?
2)如果没有,如何将wchar_t型的变量转换为char型的?

多谢各位!

[解决办法]

C/C++ code
char*  C_Style_WChar2Ansi(LPCWSTR pwszSrc){    int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);    if (nLen<= 0) return NULL;    char* pszDst = new char[nLen]; //注意:这里分配了内存,需要在外面释放,不要忘记了    if (NULL == pszDst) return NULL;    WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);    pszDst[nLen -1] = 0;    return pszDst;}//宽字节转成多字节,记得返回的指针要在外面释放,否则内存泄漏.char* C_Sytle_ws2s(LPCWSTR inputws){     return C_Style_WChar2Ansi(inputws);}
[解决办法]
传统的socket api都是unix风格的,没办法,那时候还没有unicode,你看windows的socket api命名规则都和普通api不一样(没有Pascal大小写命名,没有匈牙利命名)

你用char不就行了,需要unicode字符串的地方转一下就是了
[解决办法]
wchar_t型的变量转换为char型
//wstring to string
std::string ws2s(const std::wstring& ws)
{
std::string curLocale = setlocale(LC_ALL, NULL);
setlocale(LC_ALL, "chs");
const wchar_t* _Source = ws.c_str();
size_t _Dsize = 2 * ws.size() + 1;
char *_Dest = new char[_Dsize];
memset(_Dest,0,_Dsize);
wcstombs(_Dest,_Source,_Dsize);
std::string result = _Dest;
delete []_Dest;
setlocale(LC_ALL, curLocale.c_str());

return result;
}

//string to wstring
std::wstring s2ws(const std::string& s)
{
setlocale(LC_ALL, "chs");
const char* _Source = s.c_str();
size_t _Dsize = s.size() + 1;
wchar_t *_Dest = new wchar_t[_Dsize];
wmemset(_Dest, 0, _Dsize);
mbstowcs(_Dest,_Source,_Dsize);
std::wstring result = _Dest;
delete []_Dest;
setlocale(LC_ALL, "C");

return result;
}

读书人网 >C++

热点推荐