02-07 WideCharToMultiByte函数使用

马上就要下班了。今天做了什么呢?

好像就做了比较简单的几个函数的学习吧。

上午有一个困惑:

unsigned char 和 char 到底怎么玩呢?可以直接互相强制转换吗?

字符类型:
char是一个字节, 8位,有符号,所以范围是 [-128, pow(2,7)-1 = 127]
BYTE是一个字节, 8位,无符号,所以范围是 [0, pow(2,8)-1=255]

BYTE和char可以随便转换,信息不会丢失。

leader提示到,一直都可以强转,只不过有时候可能信息会显示不出来,但是并不会丢失,再强转回来,信息还是在那里。所以可以随便转。


下午接触到Unicode和UTF8的一个转换函数,里面大概实现就是调用了2个API函数:

int nUtf8Length = WideCharToMultiByte(CP_UTF8
			, 0
			, wcsCnt
			, nStrLen//如果这个值为-1,字符串将被设定为以NULL为结束符的字符串,并且自动计算长度。
			, NULL
			, 0
			, NULL
			, FALSE);
//再来一个看起来才是真正的转换函数:
int nLength = WideCharToMultiByte(CP_UTF8
			, 0 
			, wcsCnt
			, nStrLen
			, (LPSTR)strRet.c_str()
			, nUtf8Length
			, NULL
			, FALSE);
注意:函数WideCharToMultiByte使用不当,会给影响程序的安全。调用此函数会很容易导致内存泄漏,因为lpWideCharStr指向的输入缓冲区大小是宽字符数,而lpMultiByteStr指向的输出缓冲区大小是字节数。
为了避免内存泄漏,应确保为输出缓冲区指定合适的大小。我的方法是先使cbMultiByte为0调用WideCharToMultiByte一次以获得所需缓冲区大小,为缓冲区分配空间,然后再次调用WideCharToMultiByte填充缓冲区。
————参考:  http://blog.sina.com.cn/s/blog_55a406730100rgtt.html
string类的重载赋值操作符,可以传入const char*
char sz[100] = "abcd";
string str = sz;
知识点1: Unicode版本下的CStrig是可以转换成const wchar_t*——可以直接当作const wchar_t*

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WideCharToMultiByte函数是Windows API中的一个函数,用于将Unicode编码的字符串转换为多字节编码的字符串。 函数原型如下: ```c++ int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar ); ``` 参数说明: - CodePage:指定字符编码方式,如CP_ACP代表使用系统默认编码方式。 - dwFlags:指定转换方式,如WC_NO_BEST_FIT_CHARS用于忽略无法转换的字符。 - lpWideCharStr:指向Unicode编码的字符串。 - cchWideChar:指定lpWideCharStr字符串的长度,如果为-1,则表示字符串以NULL结尾。 - lpMultiByteStr:指向转换后的多字节编码字符串。 - cbMultiByte:指定lpMultiByteStr字符串的长度,如果为0,则表示函数只返回需要的缓冲区大小,不进行转换。 - lpDefaultChar:指向默认字符,用于处理无法转换的字符。 - lpUsedDefaultChar:指向一个BOOL类型的变量,用于标识是否使用了默认字符。 使用WideCharToMultiByte函数时,首先需要确定要转换的字符串的编码方式和转换方式,然后分配足够的缓冲区大小来存储转换后的字符串,最后调用函数进行转换。 示例: ```c++ #include <Windows.h> #include <iostream> using namespace std; int main() { wchar_t wstr[] = L"这是一个测试字符串"; int wlen = wcslen(wstr); int mlen = WideCharToMultiByte(CP_ACP, 0, wstr, wlen, NULL, 0, NULL, NULL); char* mstr = new char[mlen + 1]; WideCharToMultiByte(CP_ACP, 0, wstr, wlen, mstr, mlen, NULL, NULL); mstr[mlen] = '\0'; cout << mstr << endl; delete[] mstr; return 0; } ``` 此示例将Unicode编码的字符串转换为系统默认编码方式的多字节编码字符串,并输出转换后的字符串。在使用WideCharToMultiByte函数时,需要注意分配缓冲区的大小,否则可能会导致转换失败或者缓冲区溢出的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值