马上就要下班了。今天做了什么呢?
好像就做了比较简单的几个函数的学习吧。
上午有一个困惑:
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*