让Basicexcel完美支持中文且不改变原有接口
2011-04-23 12:19
260 查看
最近项目由于要保存较大量的数据,而开发工具是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编码的文字,使其能完美支持中文或中英文混合数据。
修改后的源码下载:http://download.csdn.net/source/3218854
网上评论说这个类唯一的缺点是不能很好的支持中文,其实该类对中文支持的接口也是很完备的,问题就出在有时对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编码的文字,使其能完美支持中文或中英文混合数据。
修改后的源码下载:http://download.csdn.net/source/3218854
相关文章推荐
- 让Basicexcel完美支持中文且不改变原有接口
- [组件代码共享]可逆加密,支持中文,支持密钥,支持ASP,加密后的密文每次都不同,且可随意改变算法
- 让Source Insight完美支持中文注释
- 让Webalizer完美支持中文,让生成图片也支持中文
- 让Source Insight完美支持中文注释
- IIS下配置WordPress永久链接支持中文完美方法
- 服务器部署VS 2005/2008 ReportViewer,完美支持中文
- 可逆加密,支持中文,支持密钥,加密后的密文每次都不同,且可随意改变算法 组件之Vb.Net版本
- MarkdownPad2 Pro v2.4.2.29969 专业中文破解版完美支持table表格语法
- 恐怖的boost库,难道还有什么是没有的吗?改变了对原有跨平台支持库开发想法。假如我以后不能使用boost库那怎么办啊?!
- windows下gvim的配置完美支持中文和UTF-8
- 让Source Insight完美支持中文注释
- source insight 完美支持中文(解决中文乱码)
- Source Insight 3.X 插件支持utf8,完美解决中文乱码,另附优美的配置文件一份
- 让Source Insight完美支持中文注释
- 让Source Insight完美支持中文注释、中文搜索(转)
- 让Source Insight完美支持中文注释 (转)
- sourceinsight - 完美支持中文注释
- Source Insight4.0破解,完美支持中文
- adb shell input text 完美支持中文输入