windows 将 const wchar_t* 转换为 const char*
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8059724/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Convert const wchar_t* to const char*
提问by ME-dia
I am trying to use GetHostByName() this requires a const char*. I have my URL in a variable that is in a cost wchar_t* format. How can I convert this so that GetHostByName may use it? The code.
我正在尝试使用 GetHostByName() 这需要一个 const char*。我的 URL 位于成本 wchar_t* 格式的变量中。如何转换它以便 GetHostByName 可以使用它?编码。
BSTR bstr;
pBrowser->get_LocationURL(&bstr);
std::wstring wsURL;
wsURL = bstr;
size_t DSlashLoc = wsURL.find(L"://");
if (DSlashLoc != wsURL.npos)
{
wsURL.erase(wsURL.begin(), wsURL.begin() + DSlashLoc + 3);
}
DSlashLoc = wsURL.find(L"www.");
if (DSlashLoc == 0)
{
wsURL.erase(wsURL.begin(), wsURL.begin() + 4);
}
DSlashLoc = wsURL.find(L"/");
if (DSlashLoc != wsURL.npos)
{
wsURL.erase(DSlashLoc);
}
wprintf(L"\n Current Website URL: %s\n\n", wsURL.c_str());
HOSTENT *pHostEnt;
int **ppaddr;
SOCKADDR_IN sockAddr;
char* addr;
pHostEnt = gethostbyname(wsURL.c_str());
ppaddr = (int**)pHostEnt->h_addr_list;
sockAddr.sin_addr.s_addr = **ppaddr;
addr = inet_ntoa(sockAddr.sin_addr);
printf("\n Current Website IP:%s", addr);
int length = WideCharToMultiByte (CP_ACP, WC_COMPOSITECHECK, wsURL.c_str(), -1, NULL, 0, NULL, NULL);
std::string LogURL(length+1, 0);
int result = WideCharToMultiByte (CP_ACP, WC_COMPOSITECHECK, wsURL.c_str(), -1, &LogURL[0],length+1, NULL, NULL);
myfile << "\n Current Website URL:" << LogURL;
myfile << "\n Current Website IP:"<< addr;
This is the error I am getting. IntelliSense:argument of type "const wchar_t *" is incompatible with parameter of type "const char *"
这是我得到的错误。IntelliSense:“const wchar_t *”类型的参数与“const char *”类型的参数不兼容
采纳答案by ME-dia
This seems to work. Comments welcome.
这似乎有效。欢迎评论。
int Newlength = WideCharToMultiByte (CP_ACP, WC_COMPOSITECHECK, wsURL.c_str(), -1, NULL, 0, NULL, NULL);
std::string NewLogURL(Newlength+1, 0);
int Newresult = WideCharToMultiByte (CP_ACP, WC_COMPOSITECHECK, wsURL.c_str(), -1, &NewLogURL[0],Newlength+1, NULL, NULL);
HOSTENT *pHostEnt;
int **ppaddr;
SOCKADDR_IN sockAddr;
char* addr;
pHostEnt = gethostbyname(NewLogURL.c_str());
ppaddr = (int**)pHostEnt->h_addr_list;
sockAddr.sin_addr.s_addr = **ppaddr;
addr = inet_ntoa(sockAddr.sin_addr);
printf("\n Current Website IP:%s", addr);
回答by karthik
I like to use wcstombs() because it is pretty easy to use.
我喜欢使用 wcstombs() 因为它很容易使用。
Try this sample:
试试这个示例:
char *str = new char[4046];
wchar_t array[] = L"Hello World";
wcstombs(str, array, 12);
std::cout << str;
This is how you have to convert wchar_t into char*.
这就是您必须如何将 wchar_t 转换为 char*。
EDIT
编辑
Changes in your code:
代码中的更改:
char* addr = new char[4046];
wcstombs(wsURL, addr, wsURL.size());
pHostEnt = gethostbyname(addr);
回答by Abdullah K
/***** This code is well done *****/
#include...
#include...
int wmain(int argc, wchar_t *argv[])
{
...
...
char *path = new char[255];
wcstombs(path, argv[2], 255);
IplImage *img;
if (img = cvLoadImage (path, 1))
{
Mat input_img = Mat (img);
imshow ("haha",input_img);
waitKey(0);
}
...
...
//wcout<<endl<<argv[2];
}
回答by Ana Betts
WideCharToMultiByte is the Win32 API call that does this at the end of the day, though depending on what frameworks you're using (MFC, WTL, etc), there may be a better way.
WideCharToMultiByte 是在一天结束时执行此操作的 Win32 API 调用,尽管取决于您使用的框架(MFC、WTL 等),可能有更好的方法。