VC中的字符串转换宏
C SourceType [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<>(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
VC中的字符串转换宏的更多相关文章
- ATL字符串转换宏
有比MultiByteToWideChar和WideCharToMultiByte更简单的字符串转换宏,你相信吗?头文件 d:\program files\microsoft visual studi ...
- VC 中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用
CSDN原博文:http://blog.csdn.net/houkai363/article/details/8134787 遇到了:不能将参数 1 从“const char [5]”转换为“LPCT ...
- VC 中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用(简单明了)
一. 在字符串前加一个L作用: 如 L"我的字符串" 表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节. strlen("as ...
- VC中预处理指令与宏定义详解
刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具.使用它们可以进行简单的源代码控制,版本控制,预警或者完成一些特殊的功能. 一个 ...
- js中把字符串转换成number格式方法
方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有 ...
- Objective - C 中NSString (字符串)与C中的字符串转换问题
NSString是一个常用的类,NSString是原生支持unicode C中的字符串 比如char * a = "hello world"; 是utf8类型的, char* d ...
- 【转】VC中的字符串处理
http://hi.baidu.com/nmn714/item/ab8d2a96d0f2d6f228164727 貌似不少人刚开始做windows程序时都会纠结在字符串处理上,所以我把关于字符串处理的 ...
- DB2 VC++ 中连接字符串
根据你安装的驱动,有如下两种连接字符串形式.Provider=DB2OLEDB;Network Transport Library=TCPIP;Network Address=xxx.xxx.xxx. ...
- URL地址中的字符串转换
url出现了有+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值,怎么解决?解决办法将这些字符转化成服务器可以识别的字符,对应关系如下:URL字符转义 用其它 ...
随机推荐
- python mysql 视图 触发器 事物 存储过程 用户授权 数据备份还原
###################总结########### 视图是一个虚拟表(非真实存在) 是跑在内存中的表,真实表是在硬盘上的表 使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去 ...
- Maven入门:使用Nexus搭建Maven私服及上传下载jar包
一. 私服搭建及配置 1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓 ...
- getResource()和getResourceAsStream以及路径问题【转】【补】
一 getResource 用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就 ...
- 解析ArcGis拓扑——根据拓扑错误记录提取shp文件、导出Excel表格
在ArcGis拓扑检查的流程——以面重叠检查为例中讲述了如何在ArcGis进行拓扑检查与修改. 在实际操作中,有时我们还需要将ArcGis拓扑检查的结果制作成报告或者提取错误信息反馈作业方. 本文仍然 ...
- 用python实现单向链表
单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...
- linux磁盘空间占满问题快速定位并解决
经常会遇到这样的场景:测试环境磁盘跑满了,导致系统不能正常运行!此时就需要查看是哪个目录或者文件占用了空间.常使用如下几个命令进行排查:df, lsof,du. 通常的解决步骤如下:1. df -h ...
- 搭建 consul 集群
=============================consul 命令行工具=============================consul 支持 Windows/Linux 等多种平台, ...
- 在SQL注入中利用MySQL隐形的类型转换绕过WAF检测
web应用一般采用基于表单的身份验证方式(页面雏形如下图所示),处理逻辑就是将表单中提交的用户名和密码传递到后台数据库去查询,并根据查询结果判断是否通过身份验证.对于LAMP架构的web应用而言,处理 ...
- Codeforces 1065F(树形dp)
题目链接 题意 给一棵树,进行如下操作,如果当前点非叶子,则往子树移动,否则最多向上移动k次,问从根节点开始最多访问多少叶子 思路 预处理出每个点最多能“白嫖”到几个叶子,根据下一个点的状态更新最优方 ...
- Empirical Evaluation of Speaker Adaptation on DNN based Acoustic Model
DNN声学模型说话人自适应的经验性评估 年3月27日 发表于:Sound (cs.SD); Computation and Language (cs.CL); Audio and Speech Pro ...