常用编码详解
2007-07-21 21:36:06 来源:WEB开发网核心提示: 注:其中见到有人在使用的时候,申请缓冲区空间时候是申请了(zise + 1)个来,常用编码详解(10),最后一个字节写'''',结束字符串,其实没有必要判断是不是为空,因为删除空指针是没有问题的,但是在我调试时候发现:系统给的size已经包含了一个写入
注:其中见到有人在使用的时候,申请缓冲区空间时候是申请了(zise + 1)个来,最后一个字节写'''',结束字符串。但是在我调试时候发现:系统给的size已经包含了一个写入''''的字节,而且最后得到的串中,''''是已经被系统API写入了。(也许我的实验有错误,有待验证)。把Unicode字符数组转换为UTF-8和UTF-7的方法类似,只要是WideCharToMultiByte函数的第一个表示代码页参数改为CP_UTF7(65000)和CP_UTF8(65001)。
同样道理,把多字节转换为Unicode字符数组,也有相应的函数。和上面的函数类似,可以通过先提供一个空缓冲区而先得到需要的大小,然后开辟空间得到最后的字符数组。但是考虑到效率,可以适当牺牲一些空间,提供一个足够大的字符数组,数组大小在极端的情况下(全是ASCII)是和字节数组大小一样的。
int StringEncode::Gb2312ToUnicode(WCHAR **dest, const char *src)
{
int length = strlen(src); // null terminated buffer
WCHAR *buffer = new WCHAR[length + 1]; // WCHAR means unsinged short, 2 bytes
// provide enough buffer size for Unicodes
int ret = ::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, length, buffer, length);
buffer[ret] = 0;
if (*dest != 0)
delete *dest;
*dest = buffer;
return ret;
}
注:删除以前的缓冲区时候的操作,其实没有必要判断是不是为空,因为删除空指针是没有问题的,因为delete内部提供了这样的机制。
更多精彩
赞助商链接