ansi和unicode(二)BasicExcel 操作Excel用中文"另存为"存档文件名显示乱码(Vs2008编译)

Vs2008 编译BasicExcel 操作Excel用中文“另存为”,存档文件名显示乱码

比如我用"你好.xls"存档,实际显示“ÄãºÃ.xls”(我的工程设置Vs2008的字符集为“多字符集”)


而用Vc6.0编译 BasicExcel 操作Excel用中文“另存为”,存档文件名显示正常,真是郁闷了。

PS: 

从设置选项中可以看到,工程中使用的字符集可设置为“Multi-Byte Character Set”或“Unicode Character Set”,其中“Multi-Byte Character Set”表示使用ANSI编码方式,“Unicode Character Set”表示使用UNICODE编码方式。

那么这两种编码方式有什么样的区别呢?

(1)传统的计算机使用ANSI编码,在ANSI编码模式下,英文字符都用1个字节表示,而某些其它国家的文字(如汉字、日文),无法用单个字节来表示,ANSI便采用多个字节来表示这些字符(汉字是2个字节)。

(2)UNICODE包含UTF-8、UTF-16、UTF-32等多种编码方案(目前windows一般使用UTF-16)。拿UTF-16来说,规定所有字符都使用2个字节表示(不论英文字母还是汉字),对于超出2个字节范围的字符采用代理(采用4个字节表示)。

UNICODE相比ANSI有很多方面的优势(优势体现在哪?),微软非常提倡使用UNICODE编码方式,在MS较新版本的系统中都是采用UNICODE编码的。因此,即便我们在自己写的程序中使用了ANSI编码,系统会将其转换为UNICODE再对其进行处理。



我先尝试着把BasicExcel关于mbstowcs和wcstombs的标准C库函数都改成Windows Api的MultiByteToWideChar和 WideCharToMultiByte,因为mbstowcs和wcstombs的标准C库函数对于中文支持不好,但发现发现不行


又来回折腾,弄了2天时间,跟踪代码,发现问题是fstream中的open方法,系统内部调用mbstowcs_s出现问题,wc_name 出现乱码(filename是好的)

_CRTIMP2_PURE FILE *__CLRCALL_PURE_OR_CDECL _Fiopen(const char *filename,
	ios_base::openmode mode, int prot)
	{	// open wide-named file with byte name
	wchar_t wc_name[FILENAME_MAX];


	if (mbstowcs_s(NULL, wc_name, FILENAME_MAX, filename, FILENAME_MAX - 1) != 0)
		return (0);
	return _Fiopen(wc_name, mode, prot);
	}


该函数的调用结果依赖于程序的本地化设置。而本地化设置可以通过setlocale函数来设置,

setlocale(LC_ALL, "chinese")表示将程序本身的语言设置为中文,而程序启动时默认设置为LC_ALL="C"。在使用mbstowcs_s进行字符串转换时,只有当LC_ALL="chinese"时,含中文的字符串才能正确的转换成其对应的宽字节字符,否则(在LC_ALL="C"时),汉字会被看成2个单字节的字符,然后再转换成宽字节的字符,这样转换的结果显然是错误的!


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值