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

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

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

(0)
上一篇 2021年6月19日 上午11:00
下一篇 2021年6月19日 下午12:00


相关推荐

  • 网页鼠标点击特效案例收集

    网页鼠标点击特效案例收集1 鼠标点击出随机颜色的爱心 DOCTYPE tml htmllang en head metacharset UTF 8 metaname viewport content width device width initial scale 1 0 title Document title metaname viewport content width device width initial scale 1 0 metacharset UTF 8 head htmllang en

    2026年3月17日
    2
  • 屠龙之技 作者:长铗

    屠龙之技 作者:长铗一  雨水从宽阔的大理石台阶上淌下来,打湿了年轻人制作考究的山羊皮皮鞋。他的身形颀长瘦削,撑一把漆黑的木柄雨伞,侧脸仰望着灰蒙蒙的天空。年轻人推开图书馆那扇锈涩厚重的大门时,一只鸽子飞了出来。他钝重的步子在高耸狭窄的空间里激荡回响。这是一个由教堂改建而成的街区图书馆,在这个时代,聆听圣音的人已经不多了。  年轻人停住了脚步,目光蓦地垂落到教堂内远远的一角。冬日灰冷的阳光从高窗上的彩色玻璃中透下…

    2022年5月20日
    48
  • jmeter性能测试步骤入门_jmeter接口性能测试

    jmeter性能测试步骤入门_jmeter接口性能测试原文转自:https://blog.csdn.net/lovesoo/article/details/78579547ApacheJMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言,JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是每个测试人员都必须要掌握的工具之一。本文为JMeter性能测试完整入门篇,从Jmeter下载安装到编写一个完整…

    2022年10月4日
    3
  • 拆解智能体系统的能力和构成,我们需要的是可靠的AI系统,而不是Agents

    拆解智能体系统的能力和构成,我们需要的是可靠的AI系统,而不是Agents

    2026年3月15日
    1
  • Java中文乱码问题如何解决?

    Java中文乱码问题如何解决?中文乱码问题一、POST请求参数中文乱码二、Response获取流对象中文乱码一、POST请求参数中文乱码在输入中文或特殊字符时,POST请求参数会出现乱码,由于POST参数是在请求体中,获取POST请求参数通过流来获取,我们设置流的编码即可解决中文乱码问题。因为get方式请求参数在url中,post方式请求参数在请求体中,虽然通过getParameter方式获取参数,但内部仍然是通过流获取参数的值,需要设置流的字符集。【解决办法】:获取请求参数之前,设置流的编码re

    2022年7月8日
    48
  • VBA数组完全教程

    VBA数组完全教程兰色幻想 VBA 数组入门教程 10 集 1 前言 不要把 VBA 数组想的太神秘 它其实就是一组数字而已 2 数组的维数 Sub 数组示例 DimxAsLong yAsLongDimar 1To10 1To3 创建一个可以容下 10 行 3 列的数组空间 Forx 1To4Fory 1To3ar

    2026年3月20日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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