让Basicexcel完美支持中文且不改变原有接口

最近项目由于要保存较大量的数据,而开发工具是VC,便从网上下了几个能够读写EXCEL文件的类。使用对比后还是觉得Basicexcel又快又好也够用。

网上评论说这个类唯一的缺点是不能很好的支持中文,其实该类对中文支持的接口也是很完备的,问题就出在有时对wchar_t类型的参数处理不好。

比如在VC中,字符串的编码默认情况下都是使用ASCII码,不论是中文还是英文。只是英文占一个字节,而中文占两个字节,如

char *str = "Hi中国"

其字符长度为1+1+2+2=6个字节。Basicexcel中提供读写中文的接口其参数为wchar_t双字节类型,因此如果参数传递时处理不完善就会有问题。最快而又方便编程的解决方法便是稍微改变两个函数:

函数1:将void SetWString(const wchar_t* str)的参数改为char*类型并修改函数体

void BasicExcelCell::SetWString(const char* str) 
{
wchar_t *pUnicode = NULL;
size_t length = MultiByteToWideChar(CP_ACP,MB_COMPOSITE,str,-1,NULL,0);

if (length > 0)
{
pUnicode = new wchar_t[length+1];
memset(pUnicode,0,(length+1)*sizeof(wchar_t)); 
MultiByteToWideChar(CP_ACP,MB_COMPOSITE,str,-1,(LPWSTR)pUnicode,length);

type_ = WSTRING;
wstr_ = vector<wchar_t>(length+1);
wcscpy(&*(wstr_.begin()), pUnicode);
str_.clear();

delete []pUnicode;
}

else EraseContents();
}

函数2:修改void Set(const wchar_t* str)函数体

void BasicExcelCell::Set(const wchar_t* str) 
{
char *pAscii = NULL;
size_t length = WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,str,-1,NULL,0,NULL,NULL); 
if (length > 0)
{
pAscii = new char[length+1];
memset(pAscii,0,(length+1)*sizeof(char)); 
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,str,-1,(LPSTR)pAscii,length,NULL,NULL);

SetWString(pAscii);
delete []pAscii;
}
}

作以上两处修改后,即可保持编程接口不变,又能直接将CString、char*等类型的字符串保存为Unicode编码的文字,使其能完美支持中文或中英文混合数据。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值