C++中wchar_t* 和 char* 之间的转换问题

u_zero 2009-06-16 10:57:56
RT,我想打开一个网页,URL地址由若干的wchar_t*的字符串组成,我像把它们拼起来,但是又没找到对应wchar_t类型的字符串的操作函数。因此考虑将wchar_t*的字符串转成char*,用<string>库中的函数操作之后再转换回去,代码如下:
#include "stdafx.h"
#include <iostream>
#include "windows.h"
#include "shellapi.h"
#include <string>
#include "stdlib.h"
//#include <wstring>


using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

wchar_t *site=L"http://www.google.fr/";
wchar_t *param=L"search?hl=fr&q=sd&btnG=Recherche+Google&meta=&aq=f&oq=";
size_t len;
size_t converted;

//把site从wchar_t转换成char
char *CStr1;
len = wcslen(site)+1;
converted = 0;
CStr1=(char*)malloc(len*sizeof(char));
wcstombs_s(&converted, CStr1, len, site, _TRUNCATE);
cout<<CStr1<<endl;

//同上,转换param然后拼起来得到完整url地址
char *CStr2;
len=wcslen(param)+1;
converted=0;
CStr2=(char*)malloc(len*sizeof(char));
wcstombs_s(&converted, CStr2, len, param, _TRUNCATE);
cout<<CStr2<<endl;

strcat(CStr1,CStr2);
cout<<CStr1<<endl;

//把url地址转成wchat_t形
wchar_t *url;
len = strlen(CStr1)+1;
converted = 0;
url=(wchar_t*)malloc(len*sizeof(wchar_t));
mbstowcs_s(&converted, url, len, CStr1, _TRUNCATE);

//把url从wchar_t再转回char

char *CStr;
len = wcslen(url)+1;
converted=0;
CStr = (char*)malloc(len*sizeof(char));
wcstombs_s(&converted, CStr, len, url, _TRUNCATE);
//这个输出结果就不对了....
cout<<CStr<<endl;




getchar();
return 0;
}

结果得到的最终wchar_t*型的url字符串与原来所期望的结果不符(最后丢了点东西,“&meta=&aq=f&oq=”这部分丢掉了),请高手麻烦帮我看看是哪里出问题了?
PS:另外请问对于wchar_t*型的字符串,有没有专门的操作函数库?我听说有<wstring>库,但是加载的时候又找不到。。。。哎 有经验的前辈们给指点下吧 谢谢了
...全文
575 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
光宇广贞 2009-06-17
  • 打赏
  • 举报
回复
An application can use the MultiByteToWideChar and WideCharToMultiByte functions to convert between strings based on code pages and Unicode strings. Although their names refer to "MultiByte", these functions work equally well with single-byte character set (SBCS), double-byte character set (DBCS), and multibyte character set (MBCS) code pages.

就是这两个函数,进行 char 同 wchar_t 之间的转换。

楼主若有MSDN,可以查,若没有,可以查网络版MSDN,关于这两个函数的说明。

http://www.cppblog.com/sunraiing9/archive/2007/03/21/20281.html
这是一个关于这两个函数用法的参考。

我上述引文来自MSDN。楼主可查。
pathuang68 2009-06-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mengde007 的回复:]
用sscanf就行了;http://blog.csdn.net/mengde007/archive/2009/06/14/4269006.aspx
此博客介绍了用法;
[/Quote]
这个好!
Proteas 2009-06-17
  • 打赏
  • 举报
回复
C库关于转换的几个函数,用起来很简单:
1. setlocal
char *setlocale( int category, const char *locale );

2. mbstowcs
Converts a sequence of multibyte characters to a corresponding sequence of wide characters.
size_t mbstowcs( wchar_t *wcstr, const char *mbstr, size_t count );

3. wcstombs
Converts a sequence of wide characters to a corresponding sequence of multibyte characters.
size_t wcstombs( char *mbstr, const wchar_t *wcstr, size_t count );


qq675927952 2009-06-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mengde007 的回复:]
用sscanf就行了;http://blog.csdn.net/mengde007/archive/2009/06/14/4269006.aspx
此博客介绍了用法;
[/Quote]

up一下,好像VC中可以自动转化,而在VS2008下要自己手工转换。。
老邓 2009-06-17
  • 打赏
  • 举报
回复
哪里不对了?VC10测试通过:

#include <iostream>
#include "windows.h"
#include "shellapi.h"
#include <string>
#include "stdlib.h"
//#include <wstring>
#include <tchar.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

wchar_t *site=L"http://www.google.fr/";
wchar_t *param=L"search?hl=fr&q=sd&btnG=Recherche+Google&meta=&aq=f&oq=";
size_t len;
size_t converted;

//把site从wchar_t转换成char
char *CStr1;
len = wcslen(site)+1;
converted = 0;
CStr1=(char*)malloc(len*sizeof(char));
wcstombs_s(&converted, CStr1, len, site, _TRUNCATE);
cout <<CStr1 <<endl;

//同上,转换param然后拼起来得到完整url地址
char *CStr2;
len=wcslen(param)+1;
converted=0;
CStr2=(char*)malloc(len*sizeof(char));
wcstombs_s(&converted, CStr2, len, param, _TRUNCATE);
cout <<CStr2 <<endl;

strcat(CStr1,CStr2);
cout << "第一次:\n" << CStr1 <<endl;

//把url地址转成wchat_t形
wchar_t *url;
len = strlen(CStr1)+1;
converted = 0;
url=(wchar_t*)malloc(len*sizeof(wchar_t));
mbstowcs_s(&converted, url, len, CStr1, _TRUNCATE);
wcout << "转换到宽字符:\n" << url << endl;

//把url从wchar_t再转回char

char *CStr;
len = wcslen(url)+1;
converted=0;
CStr = (char*)malloc(len*sizeof(char));
wcstombs_s(&converted, CStr, len, url, _TRUNCATE);
//这个输出结果就不对了....
cout << "//这个输出结果就不对了....?\n" << CStr <<endl;

getchar();
return 0;
}

运行结果:
http://www.google.fr/
search?hl=fr&q=sd&btnG=Recherche+Google&meta=&aq=f&oq=
第一次:
http://www.google.fr/search?hl=fr&q=sd&btnG=Recherche+Google&meta=&aq=f&oq=
转换到宽字符:
http://www.google.fr/search?hl=fr&q=sd&btnG=Recherche+Google&meta=&aq=f&oq=
//这个输出结果就不对了....?
http://www.google.fr/search?hl=fr&q=sd&btnG=Recherche+Google&meta=&aq=f&oq=
  • 打赏
  • 举报
回复
strlen -> wcslen
针对宽字符的基本上都是wcs开头。
你看msdn中找对应的ansi字符的时候会列出来宽字符的版本函数。
mengde007 2009-06-16
  • 打赏
  • 举报
回复
用sscanf就行了;http://blog.csdn.net/mengde007/archive/2009/06/14/4269006.aspx
此博客介绍了用法;

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧