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

时间: 2024-09-30 22:55:42

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

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

刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具.使用它们可以进行简单的源代码控制,版本控制,预警或者完成一些特殊的功能. 一个经典的例子 使用预处理与宏定义最经典的例子莫过于加在一个头文件中以避免头文件被两次编译.试想这种的情况,有一个文件headerfile.h 它被包含在headerfile1.h中,同时在headerfile2.h 中也被包含了,现在有一个CPP文件,implement.cpp 包含了headerfi

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

一. 在字符串前加一个L作用:    如  L"我的字符串"    表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节.   strlen("asd")   =   3;     strlen(L"asd")   =   6; 二.  _T宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式    如果你定义了UNICODE,那么_T宏会把字符串

ATL字符串转换宏

在头文件<atlconv.h>中定义了ATL提供的所有转换宏,如:   A2CW       (LPCSTR)  -> (LPCWSTR)   A2W        (LPCSTR)  -> (LPWSTR)   W2CA       (LPCWSTR) -> (LPCSTR)   W2A        (LPCWSTR) -> (LPSTR) 所有的宏如下表所示: A2BSTR OLE2A T2A W2A A2COLE OLE2BSTR T2BSTR W2BSTR A

字符串转换宏

来自MSDN,标题:ATL and MFC String Conversion Macros 对ATL和MFC都有效,对于MFC字符串转换看TN059: Using MFC MBCS/Unicode Conversion Macros 和MFC Macros and Globals 一.ATL

VC MFC 中的字符串转换

// 宽字符转UTF8 string EncodeUtf8(wstring in) { string s(in.length()*3+1,' '); size_t len = ::WideCharToMultiByte(CP_UTF8, 0, in.c_str(), in.length(), &s[0], s.length(), NULL, NULL); s.resize(len); return s; } // UTF8 转宽字符 wstring DecodeUtf8(string in) {

DB2 VC++ 中连接字符串

根据你安装的驱动,有如下两种连接字符串形式.Provider=DB2OLEDB;Network Transport Library=TCPIP;Network Address=xxx.xxx.xxx.xxx;Initial Catalog=MyCtlg;Package Collection=MyPkgCol;Default Schema=Schema;UserID=myUsername;Password=myPassword; Provider=IBMDADB2;Database=myDataB

[转] String to Date conversion in hive - 在 Hive 中各种字符串转换成日期格式

[From] http://bigdataprogrammers.com/string-date-conversion-hive/ Please refer below table to convert any date format into fixed format i.e yyyy-MM-dd . Input column name: dt (String).Replace dt with your column name. Input Format Code Output Format

[C++] zlatlcv: ATL字符串转换辅助库。能很方便的将UTF-8字符串转为TCHAR等字符串

作者:zyl910 如今,UTF-8字符串的使用频率越来越多了.但是在VC中,不能直接处理UTF-8字符串,得专门去写UTF-8与窄字符串.宽字符串.TCHAR字符串相互转换的代码.不仅费时费力,而且稍不留心就容易造成内存泄露问题.于是我便想专门编写个库来解决UTF-8字符串编码问题. 特性——支持 TCHAR,能随时切换项目字符集配置.兼容 32位(x86)与64位(x64)Windows环境.兼容 VC2005 及更高版本的 VC. 一.设计思路 ATL中的字符串转换宏用起来很方便,于是我打

vc字符串转换处理:(绝对精华,收集所有的例子)

vc字符串转换处理:(绝对精华,收集所有的例子) 1.头文件中要定义宏; #define   UNICODE         #define   _UNICODE     //////////////////// char   buf[128];    memset(buf,0,128);     strcpy(buf,"你好");     WCHAR   pCName[128];     memset(pCName,0,128);     MultiByteToWideChar(CP