字符串匹配 wchar To char,摘抄别人的,自己改改,完成了自己的匹配。

本文详细介绍了wchar与char之间的区别及转换方法,包括如何正确计算wchar字符串长度,并提供了wchar转char及反之的具体实现代码。此外还涉及了MFC环境下CString与char、wchar互转的方法。

wchar 和 char 的区别不是很多,wchar 是UNICODE码 char是ANSI码 UNICODE中文等都可以显示,ANSI可能会乱码

我之前对wchar_t* wszText 用strlen求字符串长度,总是有误。对宽字节,要用wcslen(wszText)*2 千万要*2  这个得到的才是刚刚好的字符串长度

自己要把wchar_t 换成char w2a资料少,不会。看到别人写的函数,摘抄下:

//-------------------------------------------------------------------------------------------------------------------

//char to wchar
WCHAR* WChar(char *string)
{
WORD *wchr;
int wsize=MultiByteToWideChar(CP_ACP, NULL, string, strlen(string), NULL, 0);
wchr=new WORD[wsize+1];
MultiByteToWideChar(CP_ACP, NULL, string, strlen(string), wchr, wsize);
wchr[wsize]=0;
return wchr;
}

//wchar to char
char* Char(WCHAR *string)
{
char *chr;
chr=new char[wcslen(string)+1];
memset(chr, 0, wcslen(string)+1);
for(unsigned int i=0; i<wcslen(string);
{
chr[i]=(unsigned char)string[i];
}
return chr;
}

至于CString 到 char* 可以用GetString到 WCHAR* 或char*
注意返回的好像是一个 const 的 ,所以最好先强制转换一下。
然后再用上面的函数。
顺便说一下,大部分函数都支持宽字节,比如ifstream 、string
用宽字节就是 wifstream、wstring
CreateWindow的宽字节就是CreateWindowW
不用宽字节就是CreateWindowA
qq 648102143
在MFC中,一般要传递WCHAR* 或 char* 的都可以传递一个CString 对象。
首先从char 和 wchar_t 之间无法强制转换。CString 的GetString 函数会返回一个LPCWSTR 或 LPCSTR, 不管是哪个,用上面的函数都可以达到目的。

//-----------------------------------------------------------------------------------------------------------------------------------------

用在自己那,有点小问题,编译不过去,自己只用wchar2char 小改,通过!

char* wCharToChar(const wchar_t* string);

char* wCharToChar(const wchar_t* string)
{
    char* chr;
    chr=new char[wcslen(string)+1];
    memset(chr,0,wcslen(string)+1);
    for(unsigned int i=0;i<wcslen(string);i++)
    {
        chr[i]=(unsigned char)string[i];
    }
    return chr;

}
没错误




MFC 中,将 `char` 字符串转换为 `wchar_t` 类型可以采用多种方法,具体取决于项目是否启用了 Unicode 支持以及是否使用 MFC 提供的封装类和宏。 ### 使用 `CString` 类型进行转换 MFC 中的 `CString` 是一个灵活的字符串类,能够根据当前项目是否启用 Unicode 来自动适配字符类型。当项目启用 Unicode 时,`CString` 内部使用 `wchar_t`,否则使用 `char`。因此,将 `char*` 转换为 `wchar_t*` 的一种方式是先将其构造为 `CString` 对象,然后通过 `GetString()` 方法获取宽字符指针 [^2]。 ```cpp const char* szAnsi = "Hello, MFC!"; CString str(szAnsi); // 自动转换为 CString 内部的字符类型 const wchar_t* wszUnicode = str.GetString(); // 获取 wchar_t* 类型 ``` ### 使用 `CA2W` 宏进行转换 MFC 提供了类型转换宏 `CA2W`,可以直接将 `char*` 转换为 `wchar_t*`。该宏会根据当前是否启用 Unicode 编译选项自动选择是否执行转换,若启用 Unicode,则返回转换后的宽字符字符串,否则直接返回原字符串 [^1]。 ```cpp const char* szAnsi = "Hello, MFC!"; CA2W wszUnicode(szAnsi); // wszUnicode 现在是 wchar_t* 类型 ``` ### 使用 Windows API 函数 `MultiByteToWideChar` 如果希望不依赖 MFC 的宏或类,可以使用 Windows API 函数 `MultiByteToWideChar` 手动完成转换。这种方法适用于更底层的控制,例如指定代码页(如 CP_UTF8 或 CP_ACP)进行转换 [^4]。 ```cpp #include <windows.h> const char* szAnsi = "Hello, MFC!"; int nLen = MultiByteToWideChar(CP_ACP, 0, szAnsi, -1, NULL, 0); wchar_t* wszUnicode = new wchar_t[nLen]; MultiByteToWideChar(CP_ACP, 0, szAnsi, -1, wszUnicode, nLen); // 使用转换后的 wszUnicode // ... delete[] wszUnicode; ``` ### 使用自定义函数进行转换 也可以使用标准 C 库函数 `mbstowcs` 来完成转换,虽然这种方法不依赖 MFC 或 Windows API,但需要注意字符集的本地化设置 [^3]。 ```cpp #include <cstdlib> #include <cwchar> const char* szAnsi = "Hello, MFC!"; size_t len = mbstowcs(NULL, szAnsi, 0); wchar_t* wszUnicode = new wchar_t[len + 1]; mbstowcs(wszUnicode, szAnsi, len + 1); // 使用转换后的 wszUnicode // ... delete[] wszUnicode; ``` ### 注意事项 - 在 Unicode 模式下,`CString` 默认使用 `wchar_t`,因此构造 `CString` 时传入 `char*` 会自动进行转换 [^1]。 - 使用 `CA2W` 或 `MultiByteToWideChar` 时,务必注意字符串的生命周期和内存释放,避免内存泄漏。 - 若需处理 UTF-8 字符串,应将 `MultiByteToWideChar` 的第一个参数设置为 `CP_UTF8`。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值