ATL7.0引入了几个新的转换类和宏,现有的宏提供了显着的改善。新的字符串转换类和宏的名称,采取的形式如下:

  1. C SourceType [C]DestinationType[EX]

其中,[C]表示目的类型是const类型的,[EX]表示指定了保存字符串数据的固定静态缓存区的大小,如果字符串转换的结果超过了模板参数的大小,使用malloc分配空间,并在对象超出范围时释放内存。所以说这个转换宏(实质是个类)在循环中使用也是安全,它不会堆栈溢出。另外,如果试图分配堆内存和失败,它会调用AtlThrow抛出E_OUTOFMEMORY异常信息。
比较好的使用方法如下:

  1. CA2T szr(szReplaceFile);

不赞成使用如下方法:

  1. LPCTSTR szr = CA2T(szReplaceFile);

另外,可以指定缓冲区大小来做为模板参数,如下:

  1. // Changing the size of the buffer.
  2. void ExampleFunction4(LPCWSTR pszW)
  3. {
  4. // Use a 16-character buffer.
  5. ExampleFunctionA(CW2AEX<>(pszW));
  6. }

指定代码页进行转换,如下:

  1. // Specifying the code page.
  2. void ExampleFunction5(LPCWSTR pszW)
  3. {
  4. // Convert to the Macintosh code page
  5. ExampleFunctionA(CW2A(pszW, CP_MACCP));
  6. }

在实际应用中,Ansi、Unicode、Utf-8之间的转换比较多,方法可如下:
Ansi→Unicode

  1. CA2W pszW(pszA);

Ansi→Utf-8

  1. CW2A pszU8(CA2W(pszA), CP_UTF8);

Unicode→Ansi

  1. CW2A pszA(pszW);

Unicode→Utf-8

  1. CW2A pszU8(pszW, CP_UTF8);

Utf-8→Ansi

  1. CW2A pszA(CA2W(pszU8, CP_UTF8));

Utf-8→Unicode

  1. CA2W pszW(pszU8, CP_UTF8);

对于通用字符串_T()来说,如下:
_T→Ansi

  1. CT2A pszA(pszT);

_T→Unicode

  1. CT2W pszW(pszT);

_T→Utf-8

  1. CW2A pszU8(CT2W(pszT), CP_UTF8);

Ansi→_T

  1. CA2T pszT(pszA);

Unicode→_T

  1. CW2T pszT(pszW);

Utf-8→_T

  1. CW2T pszT(CA2W(pszU8, CP_UTF8));

另外,对于CString,还可以如下:

  1. CStringA strA(pszW);
  2. CStringW strW(pszA);
  3. CString str(CA2W(pszU8, CP_UTF8));

测试代码如下:

  1. void CTestFileTestDlg::OnTest()
  2. {
  3. char *pszAnsi = "akof1314无幻";
  4. ::MessageBoxA(NULL, pszAnsi, NULL, MB_OK);
  5. ::MessageBoxW(NULL, CA2W(pszAnsi), NULL, MB_OK);
  6.  
  7. wchar_t *pszUnicode = L"akof1314无幻";
  8. ::MessageBoxA(NULL, CW2A(pszUnicode), NULL, MB_OK);
  9. ::MessageBoxW(NULL, pszUnicode, NULL, MB_OK);
  10.  
  11. //以下是UTF-8编码的字符串"akof1314无幻"
  12. char *pszUtf8 = "\x61\x6b\x6f\x66\x31\x33\x31\x34\xe6\x97\xa0\xe5\xb9\xbb";
  13. ::MessageBoxA(NULL, CW2A(CA2W(pszUtf8, CP_UTF8)), NULL, MB_OK);
  14. ::MessageBoxW(NULL, CA2W(pszUtf8, CP_UTF8), NULL, MB_OK);
  15.  
  16. CStringA strA(pszUnicode);
  17. ::MessageBoxA(NULL, strA, NULL, MB_OK);
  18.  
  19. CStringW strW(pszAnsi);
  20. ::MessageBoxW(NULL, strW, NULL, MB_OK);
  21.  
  22. CString str(CA2W(pszUtf8, CP_UTF8));
  23. ::MessageBox(NULL, str, NULL, MB_OK);
  24. }

以上输出全部一样,不管在多字节下,还是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

VC中的字符串转换宏的更多相关文章

  1. ATL字符串转换宏

    有比MultiByteToWideChar和WideCharToMultiByte更简单的字符串转换宏,你相信吗?头文件 d:\program files\microsoft visual studi ...

  2. VC 中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用

    CSDN原博文:http://blog.csdn.net/houkai363/article/details/8134787 遇到了:不能将参数 1 从“const char [5]”转换为“LPCT ...

  3. VC 中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用(简单明了)

    一. 在字符串前加一个L作用:    如  L"我的字符串"    表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节.   strlen("as ...

  4. VC中预处理指令与宏定义详解

    刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具.使用它们可以进行简单的源代码控制,版本控制,预警或者完成一些特殊的功能. 一个 ...

  5. js中把字符串转换成number格式方法

    方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有 ...

  6. Objective - C 中NSString (字符串)与C中的字符串转换问题

    NSString是一个常用的类,NSString是原生支持unicode C中的字符串 比如char * a = "hello world";  是utf8类型的, char* d ...

  7. 【转】VC中的字符串处理

    http://hi.baidu.com/nmn714/item/ab8d2a96d0f2d6f228164727 貌似不少人刚开始做windows程序时都会纠结在字符串处理上,所以我把关于字符串处理的 ...

  8. DB2 VC++ 中连接字符串

    根据你安装的驱动,有如下两种连接字符串形式.Provider=DB2OLEDB;Network Transport Library=TCPIP;Network Address=xxx.xxx.xxx. ...

  9. URL地址中的字符串转换

    url出现了有+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值,怎么解决?解决办法将这些字符转化成服务器可以识别的字符,对应关系如下:URL字符转义 用其它 ...

随机推荐

  1. Jenkins权限分配

    做完Jenkins安装.项目自动化打包部署后,当然需要对小组成员进行项目权限的分配 1.安装插件:Role-based Authorization Strategy(安装过程就展示了): 2. 插件装 ...

  2. stat/lstat函数使用

    1. 进程虚拟地址空间 2. stat函数 获取文件信息 #include <sys/types.h> #include <sys/stat.h> #include <u ...

  3. json 模块 与 pickle 模块

    1 import json 3 dic={'name':'alvin','age':23,'sex':'male'} 4 print(type(dic))#<class 'dict'> 6 ...

  4. vue使用字体图标转码问题

    使用iconfont字体之后,出现的是一个方框,而没有出现相应的图标 需要通过String.fromCharCode方法转成指定unicode编码对应的十六进制字符 <div class=&qu ...

  5. 自定义CRM系统

    写在前面 之前在windows上写代码逻辑.搞前端等花了很长时间,跑通之后一直没往centos上部署, 昨天尝试部署下,结果发现静态文件找不到 =='' 由于写了2个组件: - arya model的 ...

  6. java定时器实现总结

    前言:Java定时器目前主要有3种实现方式:JDK组件,Spring Task,Quartz框架. 1. JDK组件(1) java.util.TimerTask MyTimerTask.java: ...

  7. JAVA方法调用中的解析与分派

    JAVA方法调用中的解析与分派 本文算是<深入理解JVM>的读书笔记,参考书中的相关代码示例,从字节码指令角度看看解析与分派的区别. 方法调用,其实就是要回答一个问题:JVM在执行一个方法 ...

  8. SqlExpress与 LocalDB的链接字符串转换

    1.如果是连接SQL Server Express databases,需要将连接字符串定义为:Data Source=.SQLEXPRESS" to "Data Source=( ...

  9. 微信小程序开发(4) 企业展示

    在这篇微信小程序开发教程中,我们将介绍如何使用微信小程序开发企业内部宣传展示等功能. 一.小程序主体部分 一个小程序主体部分由三个文件组成,必须放在项目的根目录,如下: 1. 小程序逻辑 App({ ...

  10. Javaweb学习笔记——(十三)——————JSTL、JSTL核心标签库、自定义标签、有标签体的标签、带有属性的标签、MVC、Javaweb三层框架

    JSTLApache提供的标签库 jar包:jstl-1.2.jar,如果传MyEclipse,他会在我们导入jar包,无需自己导入,如果没有使用MyEclipse那么需要自行导入.--------- ...