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>库,但是加载的时候又找不到。。。。哎 有经验的前辈们给指点下吧 谢谢了
...全文
605 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
此博客介绍了用法;
该工具支持多个型号,包括但不限于idata95w、idata95v以及iData95等。它是一种pda刷机软件,即个人数字助理(Personal Digital Assistant)设备的固件升级程序。刷机通常指的是将设备的固件或者操作系统进行更新或替换的过程,可以用来修复系统问题、提升设备性能或更新新功能。 刷机工具的操作过程通常包括连接设备到电脑、选择正确的固件版本、执行刷机程序以及等待过程完成。在进行刷机之前,用户需要确保下载的刷机工具版本与自己的设备型号相匹配,并严格遵循操作说明,以避免刷机失败导致设备变砖(即设备无法启动)。 在压缩包文件列表仅提到了"A5V2R2刷机工具",这可能表明该工具是为特定版本的idata95系列产品设计的。可能是指固件的版本号,比如A5V2R2可能代表某个版本的固件,其A5可能表示版本类型,V2表示版本号,R2可能表示修订级别。 刷机工具有时还包含有解锁Bootloader(引导程序)的功能,这在某些设备是进行刷机前的必要步骤。Bootloader是设备启动时首先运行的一段代码,负责加载操作系统。在一些设备上,Bootloader被锁定,以防止非授权的系统更改。解锁Bootloader可能会清除设备上的所有数据,因此这个过程需要谨慎操作。 刷机工具的使用通常涉及以下步骤: 1. 准备工作:备份好设备上的个人数据,确保数据安全。 2. 下载对应的刷机工具:根据设备型号下载相应的刷机工具,确保来源的安全可靠。 3. 启动设备至下载模式:这通常需要在设备关闭状态下同时按住特定的几个按键来进入。 4. 连接设备到电脑:使用USB数据线将设备连接到电脑。 5. 运行刷机工具:打开刷机工具软件,通常会有一个简单的用户界面指导用户完成刷机过程。 6. 执行刷机程序:根据软件指示选择相应的固件文件,然后软件会自动完成刷机过程。 7. 刷机后处理:刷机完成后,通常需要手动启动设备或进行额外的配置以确保设备正常运行。 刷机不仅在技术上有一定风险,而且可能会使设备的保修失效。因此,如果没有足够的经验或者不确定是否需要刷机,建议不要轻易尝试。此外,刷机也可能导致设备的某些功能无法使用或不稳定,所以在进行刷机之前应该进行充分的了解和准备。"
“1-考试报名系统1”项目是一个数据结构课程设计,旨在创建一个考试报名系统。该项目由汪明杰同学在软件学院软件工程专业,同济大学进行,指导教师为张颖。 本文档详细阐述了项目的分析、设计、实现和测试过程。首先,项目背景指出考试报名系统对学校教务管理的重要性,特别是在处理大量考试人员时的挑战。接着,项目需求分析部分明确了系统应具备的功能,包括用户友好性、数据处理能力等。 在项目要求,功能要求详细列出了系统应具备的各个功能,如: 1.3.1 功能要求:这可能包括考生注册、考试选择、报名、取消报名、查询考试信息等功能。 1.3.2 输入格式:可能涉及考生信息输入的格式规范,如姓名、学号、选择的考试科目等。 1.3.3 输出格式:可能涉及打印报名成功通知、查询结果展示等输出信息的格式。 项目设计部分讨论了数据结构和类的设计: 2.1 数据结构设计:可能使用数据结构如链表来存储和管理考生信息和考试数据。 2.2 类设计:包括结点类(ListNode)、双向链表类(List)以及数据库类(DataBase),用于构建系统的核心结构。 在项目实现章节,详细描述了各个功能的实现逻辑和代码,包括: 3.1 项目主体功能:涵盖系统的整体流程和代码实现。 3.2 项目初始化:如何加载初始数据,包括读取文件和手动输入。 3.3 插入数据:添加新的考生信息或考试报名。 3.4 删除数据:取消考生的报名。 3.5 修改数据:更新考生信息或考试选择。 3.6 查询数据:根据特定条件查找考生信息或考试详情。 3.7 统计数据:可能包括统计报名人数、考试科目选择情况等。 最后,项目测试部分涵盖了各种测试用例,确保系统的正确性和稳定性,如: 4.1 项目初始化测试:验证数据加载功能。 4.2 插入、删除、查找、修改和统计测试:分别检查各功能是否正常工作。 4.7 边界测试:测试特殊情况,如插入已存在的考生、删除不存在的考生等。 这个“1-考试报名系统1”项目涵盖了软件开发的完整生命周期,从需求分析到设计、实现和测试,体现了软件工程的核心原则,特别是数据结构的应用和系统功能的实现。

33,320

社区成员

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

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