CString的MakeLower 特殊情况(乱码)下,转化会出错
2016-06-21 14:11
387 查看
测试代码如下:
WIN7 VC6,ANSI表情况
注意A8被转换了。
char szText[256] = {0xA6,0xA7,0xA8,0xA9};情况
VC6,VC2013,在WIN7系统的情况下
a6 a7 a8 a9 00
都会被转换为
a6 c7 a8 a9 00
结论:调用CString的MakeLower(),要确保CString没有乱码的情况。
建议使用STL的string,代码如下:
经过IDA跟踪分析,CString最终调用MSVCRT(D).dll的_mbslwr(char* string)函数,
而STL调用 MSVCRT(D).dll的int tolower( intc
);
相关链接:
https://social.msdn.microsoft.com/Forums/vstudio/zh-CN/65f0347a-5ed7-4ddb-8439-1b7989b4c14d/cstringmakelower-chinese-windows-crash?forum=vclanguage
char szText[256] = {0xA6,0xA7,0xA8,0xA9}; /* char szText[256] = {0}; for (int nIndex = 1; nIndex < 256; nIndex++) { szText[nIndex - 1] = (char)nIndex; } */ CString strText = szText; CString strLower = strText; strLower.MakeLower();
WIN7 VC6,ANSI表情况
注意A8被转换了。
char szText[256] = {0xA6,0xA7,0xA8,0xA9};情况
VC6,VC2013,在WIN7系统的情况下
a6 a7 a8 a9 00
都会被转换为
a6 c7 a8 a9 00
结论:调用CString的MakeLower(),要确保CString没有乱码的情况。
建议使用STL的string,代码如下:
char szText[256] = {0xA6,0xA7,0xA8,0xA9}; string strTest = szText; std::transform(strTest.begin(), strTest.end(), strTest.begin(), ::tolower);
经过IDA跟踪分析,CString最终调用MSVCRT(D).dll的_mbslwr(char* string)函数,
char *__cdecl _mbslwr(char *string) { unsigned __int8 v2; // [sp+0h] [bp-10h]@10 int retval; // [sp+4h] [bp-Ch]@4 char ret[4]; // [sp+8h] [bp-8h]@4 char *cp; // [sp+Ch] [bp-4h]@1 _lock(25); for ( cp = string; *cp; ++cp ) { if ( byte_10265061[(unsigned __int8)*cp] & 4 ) { retval = __crtLCMapStringA(__mblcid, 0x100u, cp, 2, ret, 2, __mbcodepage, 1); if ( !retval ) { _unlock(25); return 0; } *cp = ret[0]; if ( retval > 1 ) *++cp = ret[1]; } else { if ( (byte_10265061[(unsigned __int8)*cp] & 0x10) == 0x10 ) v2 = _mbcasemap[(unsigned __int8)*cp]; else v2 = *cp; *cp = v2; } } _unlock(25); return string; }
而STL调用 MSVCRT(D).dll的int tolower( intc
);
int __cdecl tolower(int c) { int result; // eax@5 int local_lock_flag; // [sp+0h] [bp-4h]@7 int ca; // [sp+Ch] [bp+8h]@9 if ( dword_10264B24 ) { InterlockedIncrement(&__unguarded_readlc_active); if ( __setlc_active ) { InterlockedDecrement(&__unguarded_readlc_active); _lock(19); local_lock_flag = 1; } else { local_lock_flag = 0; } ca = _tolower_lk(c); if ( local_lock_flag ) _unlock(19); else InterlockedDecrement(&__unguarded_readlc_active); result = ca; } else { if ( c >= 65 && c <= 90 ) c += 32; result = c; } return result; }
相关链接:
https://social.msdn.microsoft.com/Forums/vstudio/zh-CN/65f0347a-5ed7-4ddb-8439-1b7989b4c14d/cstringmakelower-chinese-windows-crash?forum=vclanguage
相关文章推荐
- VRP平台基本操作
- C语言程序设计做题笔记之C语言基础知识(下)
- 利用WinDbg找出程序崩溃的代码行号
- MVP架构了解
- Boost 共享指针 共享数组
- android-R.plurals
- cc debugger 烧写固件
- linux启动过程详解
- spring加载定时任务
- maven ArtifactTransferException: Failure to transfer
- C++ Primer 学习笔记之 --- 学习总结
- Fragment
- 又见CLOSE_WAIT
- 图片会说话之https通信过程
- 第九章:使用CoreLocation定位
- Linux 网络设备驱动开发(三) —— 网络设备驱动基本原理和框架
- 十条jQuery代码片段助力Web开发效率提升
- MFC退出时弹出提示框
- 0000000
- NSRunLoop的注意要点