【BUG挖掘】win系统WideCharToMultiByte和MultiByteToWideChar

来源:互联网 发布:cad 布局 知乎 编辑:程序博客网 时间:2024/06/14 00:20

BUG点:WideCharToMultiByte和MultiByteToWideChar大部分情况转换是没问题的,但API遇到特定字符序列时,转换后丢失数据,出现乱码,此种乱码并不是编码不支持某字符,而是特定序列会出问题,下图是将正常字符串转换为服务器需要的字符串后,再转换回来,出现乱码。

起因:最近一个朋友写vb的FTP读写,服务器返回的文件目录编码不是普通的Unicode也不是ANSI,而是将UTF-8编码的字符串,强行以ANSI格式转换为Unicode,所以显出时需要一个转换过程:目标字符串→以ANSI方式转换为多字节字符集(转换后的结果是UTF-8编码)→按照UTF-8格式转换为Unicode。





发此文章并不是求乱码的其它解决方案,百度贴吧我也发一帖,而是无意间发现这俩函数在转换字符上有bug,我这测试程序的转换过程就是A→B→A的形式,别问我为什么要折腾转换一个来回,只是测试而已。网上千篇一律的那些什么文章“最后一字符乱码”,说缓冲区长度没传对导致乱码的问题,这不是长度不够,而是特定字符序列乱码。如果函数有其它参数上的传递问题,可以指点指点。
因为函数调用用的我自己写的tlb类型库,没用declare声明,所以参参传递上有byval 0,这只是需要给指针参数传个NULL而已,没有tlb的用declare声明也行
最开始,Unicode转多字节集是用的内置函数strconv,多字节集转目标字符串是用的API,后来全部换API也一样有问题

测试条件是vb,但这bug换到vc里同样有


原创粉丝点击