VC中的字符串转换宏

VC中的字符串转换宏

  ATL7.0引入了几个新的转换类和宏,现有的宏提供了显着的改善。新的字符串转换类和宏的名称,采取的形式如下:
C SourceType 2[C]DestinationType[EX] 
        其中,[C]表示目的类型是const类型的,[EX]表示指定了保存字符串数据的固定静态缓存区的大小,如果字符串转换的结果超过了模板参数的大小,使用malloc分配空间,并在对象超出范围时释放内存。所以说这个转换宏(实质是个类)在循环中使用也是安全,它不会堆栈溢出。另外,如果试图分配堆内存和失败,它会调用AtlThrow抛出E_OUTOFMEMORY异常信息。
比较好的使用方法如下:
CA2T szr(szReplaceFile);  
不赞成使用如下方法:
LPCTSTR szr = CA2T(szReplaceFile); 
另外,可以指定缓冲区大小来做为模板参数,如下:
// Changing the size of the buffer. 
void ExampleFunction4(LPCWSTR pszW) 

   // Use a 16-character buffer. 
   ExampleFunctionA(CW2AEX<16>(pszW)); 

指定代码页进行转换,如下:
// Specifying the code page. 
void ExampleFunction5(LPCWSTR pszW) 

   // Convert to the Macintosh code page 
   ExampleFunctionA(CW2A(pszW, CP_MACCP)); 

在实际应用中,Ansi、Unicode、Utf-8之间的转换比较多,方法可如下:
Ansi→Unicode
CA2W pszW(pszA); 
Ansi→Utf-8
CW2A pszU8(CA2W(pszA), CP_UTF8); 
Unicode→Ansi
CW2A pszA(pszW); 
Unicode→Utf-8
CW2A pszU8(pszW, CP_UTF8); 
Utf-8→Ansi
CW2A pszA(CA2W(pszU8, CP_UTF8)); 
Utf-8→Unicode
CA2W pszW(pszU8, CP_UTF8); 
对于通用字符串_T()来说,如下:
_T→Ansi
CT2A pszA(pszT); 
_T→Unicode
CT2W pszW(pszT); 
_T→Utf-8
CW2A pszU8(CT2W(pszT), CP_UTF8); 
Ansi→_T
CA2T pszT(pszA); 
Unicode→_T
CW2T pszT(pszW); 
Utf-8→_T
CW2T pszT(CA2W(pszU8, CP_UTF8)); 
另外,对于CString,还可以如下:
CStringA strA(pszW); 
CStringW strW(pszA); 
CString str(CA2W(pszU8, CP_UTF8)); 

测试代码如下:
void CTestFileTestDlg::OnTest() 

    char *pszAnsi = “akof1314无幻”; 
    ::MessageBoxA(NULL, pszAnsi, NULL, MB_OK); 
    ::MessageBoxW(NULL, CA2W(pszAnsi), NULL, MB_OK); 
 
 
    wchar_t *pszUnicode = L”akof1314无幻”; 
    ::MessageBoxA(NULL, CW2A(pszUnicode), NULL, MB_OK); 
    ::MessageBoxW(NULL, pszUnicode, NULL, MB_OK); 
 
 
    //以下是UTF-8编码的字符串”akof1314无幻” 
    char *pszUtf8 = “\x61\x6b\x6f\x66\x31\x33\x31\x34\xe6\x97\xa0\xe5\xb9\xbb”; 
    ::MessageBoxA(NULL, CW2A(CA2W(pszUtf8, CP_UTF8)), NULL, MB_OK); 
    ::MessageBoxW(NULL, CA2W(pszUtf8, CP_UTF8), NULL, MB_OK); 
 
 
    CStringA strA(pszUnicode); 
    ::MessageBoxA(NULL, strA, NULL, MB_OK); 
 
 
    CStringW strW(pszAnsi); 
    ::MessageBoxW(NULL, strW, NULL, MB_OK); 
 
 
    CString str(CA2W(pszUtf8, CP_UTF8)); 
    ::MessageBox(NULL, str, NULL, MB_OK); 

以上输出全部一样,不管在多字节下,还是Unicode环境下。

参考资料:
1.ATL and MFC String Conversion Macros  http://msdn.microsoft.com/en-us/library/87zae4a3(v=vs.110).aspx
2.C++中Ansi、Unicode、UTF8字符串之间的转换和写入文本文件  http://dark0729.blogbus.com/logs/51496111.html
3.UTF-8, CString and CFile? (C++, MFC)  http://stackoverflow.com/questions/2318481/utf-8-cstring-and-cfile-c-mfc

转载于:https://www.cnblogs.com/super999/p/10188461.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/101233.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • BT渗透「建议收藏」

    BT渗透「建议收藏」PHP交流群:294088839,Python交流群:652376983 whois域名/ip查看域名的详细信息。ping域名/ip测试本机到远端主机是否联通。dig域名/ip查看域名解析的详细信息。host-l域名dns服务器传输zone。扫描nmap:-sS半开扫描TCP和SYN扫描。-sT完全TCP连接扫描。-sUUDP扫描-PSs…

  • 关于垃圾回收CollectGarbage()的使用

    网络上流传的关于JS释放内存的方式~大概就是只说过。将变量使用以后设置为null,但是IE的GC是当鼠标点击最小化按钮时发生~~也就是说我们从程序上看已经释放了内存其实之前更本没有释放~~~研究jsvm的时候,发现js.lang.System里面定义了gc()方法System.gc=function(){  if(System.isIeBrowser())  {…

  • 第十三章《优化》

    第十三章《优化》

  • realsense深度图像保存方法

    realsense深度图像保存方法一般使用realsense时会保存视频序列,当保存深度图像时,需要注意保存的图像矩阵的格式,不然可能造成深度值的丢失。在众多图像库中,一般会使用opencv中的imwrite()函数进行深度图像的保存。一般深度图像中深度值的单位是mm,因此一般使用np.uint16作为最终数据格式保存。例子:importnumpyasnpimportcv2deffun1(…

  • 解决mysql java.sql.SQLException: The server time zone value‘XXXXXX’ is unrecognized or represents…

    解决mysql java.sql.SQLException: The server time zone value‘XXXXXX’ is unrecognized or represents…个人错误总结解决java.sql.SQLException:Theservertimezonevalue‘XXXXXX’isunrecognizedorrepresentsmorethanonetimezone.1.报错截图使用的数据库是MySQL,驱动是6.0.3,这是由于数据库和系统时区差异所造成的,在jdbc连接的url后面加上serverTimezone=GMT

    2022年10月21日
  • 双因素身份认证系统的技术特点_mfa多因素认证

    双因素身份认证系统的技术特点_mfa多因素认证一般的状况下,用户通常使用的网络登录办法为:用户名称+密码。在密码为静态的状况下,将会产生某些问题,比如为了维护密码安全性,必须严格规定密码的长度、复杂性(例如:中英文数字夹杂,大小写间隔,长度须超过8个字符以上)及定期更换的频率。  用户为了方便记忆,常常习惯使用特殊的数字,例如家人的生日、自己的生日、身高体重、电话或门牌号码等,此种方法极不安全。  只要利用黑客工具,如字典攻击法等便能在短时间

    2022年10月24日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号