char*, wchat_t*互转 及 A2T, T2A宏及其实现原理
来源:互联网 发布:java布局思想 编辑:程序博客网 时间:2024/05/24 04:29
本文的内容是在 上一篇博文 ASCI, GB2312, UNICODE, UTF8编码比较 的基础上的。
char :单字节变量类型,表示ASCII码。
wchar_t :宽字节变量类型,用于表示Unicode字符。在<string.h>定义为:typedef unsigned short wchar_t。
TCHAR: VS下的中间类型。在“使用Unicode字符集”下TCHAR定义为wchar_t,在字符集 “未设置” 条件下TCHAR定义为char。
A2T,及T2A是两个非常有用的宏,可以用于实现char*和wchar_t*字符串之间的转换。宏的实现也将会在测试代码中给出,不感兴趣的直接跳过。费话不多说,直接上测试代码,参考代码注释。
// demo1.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <cstring>using namespace std;#include <atlbase.h>#include <Windows.h>void test_L_macro(){ char astr[] = "hello";cout<<"sizeof(astr):"<<sizeof(astr)<<endl<<"strlen(astr):"<<strlen(astr)<<endl;//L"str"表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节。wchar_t wstr[] = L"hello"; //typedef unsigned short wchar_tcout<<"sizeof(wstr)"<<sizeof(wstr)<<endl<<"wcslen(wstr):"<<wcslen(wstr)<<endl;}void test_T_macro(){/*#ifdef _UNICODE#define __T(x) L ## x#else#define __T(x) x#endif#define _T(x) __T(x)#define _TEXT(x) __T(x)#define TEXT(quote) __TEXT(quote)#ifdef _UNICODE typedef char TCHAR; #else typede wchar_t TCHAR; #endif *///如果在程序中使用了TCHAR,那么就不应该使用ANSI的strXXX函数或者Unicode的wcsXXX函数了,//而必须使用tchar.h中定义的_tcsXXX函数。TCHAR buf[] = _T("hello");cout<<"sizeof(buf):"<<sizeof(buf)<<endl<<"_tcslen(lpBuf):"<<_tcslen(buf)<<endl; /*#ifdef _UNICODE typedef wchar_t WCHAR;// wc, 16-bit UNICODE charactertypedef __nullterminated WCHAR *LPWSTR;typedef LPWSTR PTSTR, LPTSTR;#else typedef char CHAR;typedef __nullterminated CHAR *LPSTR;typedef LPSTR LPTSTR;#endif */LPTSTR lpBuf = TEXT("hello");cout<<"_tcslen(lpBuf):"<<_tcslen(lpBuf)<<endl; }void test_A2T(){USES_CONVERSION;char *astr = "hello";LPTSTR wstr = A2T(astr);#ifdef _UNICODEwcout<<"wcout\<\<wstr:"<<wstr<<endl;#elsecout<<"cout\<\<wstr:"<<wstr<<endl;#endif}void test_A2T_(){int _convert = 0;(_convert); UINT _acp = ATL::_AtlGetConversionACP() ; (_acp); LPCWSTR _lpw = 0; (_lpw); LPCSTR _lpa = 0; (_lpa);char *astr = "hello";LPTSTR wstr = ( ((_lpa = astr) == 0) ? 0 : ( _convert = (lstrlenA(_lpa)+1), (2147483647/2<_convert)? 0 : AtlA2WHelper((LPWSTR) _alloca(_convert*sizeof(WCHAR)), _lpa, _convert, _acp)));//p.s. AtlA2WHelper调用了函数MultiByteToWideChar//_alloca函数用于在栈上分配内存,参考:http://msdn.microsoft.com/en-us/library/wb1s57t5.aspxwcout<<"wcout\<\<wstr:"<<wstr<<endl;}void test_T2A(){USES_CONVERSION;LPTSTR wstr = _T("hello");char *astr = T2A(wstr);cout<<"cout\<\<astr:"<<astr<<endl;}void test_T2A_(){int _convert = 0; (_convert); UINT _acp = ATL::_AtlGetConversionACP() ; (_acp); LPCWSTR _lpw = 0; (_lpw); LPCSTR _lpa = 0; (_lpa);LPTSTR wstr = L"hello";char *astr = ( ((_lpw = wstr) == 0) ? 0 : ( (_convert = (lstrlenW(_lpw)+1), (_convert>2147483647/2) ? 0 : AtlW2AHelper((LPSTR) _alloca(_convert*sizeof(WCHAR)), _lpw, _convert*sizeof(WCHAR), _acp))));//p.s. AtlW2AHelper调用了函数WideCharToMultiByte//_alloca函数用于在栈上分配内存,参考:http://msdn.microsoft.com/en-us/library/wb1s57t5.aspxcout<<"cout\<\<astr:"<<astr<<endl;}int main(){test_L_macro();test_T_macro();test_A2T();test_A2T_();test_T2A();test_T2A_();}
P.S.
test_A2T_ 是 test_A2T的宏替换实现;test_T2A_ 是 test_T2A的宏替换实现;
0 0
- char*, wchat_t*互转 及 A2T, T2A宏及其实现原理
- A2W、W2A、A2T、T2A、(USES_CONVERSION)
- A2W、W2A、A2T、T2A的使用方法
- A2W、W2A、A2T、T2A的使用方法
- A2W、W2A、A2T、T2A的使用方法
- wchat_t 与 char
- [转载]wchar_t*,wchar_t,wchat_t数组,char,char*,char数组
- wchar_t*,wchar_t,wchat_t数组,char,char*,char数组
- 转 A2W、W2A、T2A、T2W 等宏
- Selenium 及其实现原理
- FEC原理及其实现
- Synchronized及其实现原理
- synchronized及其实现原理
- FEC原理及其实现
- Synchronized及其实现原理
- treeMap原理及其实现
- wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString....转换
- wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString 以及system("command")
- jfinal+bae部署
- 分类的IP地址(四)
- 多线程互斥 基于c++11
- 背包专辑-基础篇(持续更新中)
- GCDObjC
- char*, wchat_t*互转 及 A2T, T2A宏及其实现原理
- c# 实现datagridview 用回车向右移动,到头换行,支持编辑模式
- java阻塞队列以及非阻塞队列
- LeetCode(Remove Duplicates from Sorted List) 两道删除排序链表中重复数字
- asp.net服务器控件生命周期
- 第五周学习内容
- ValueTrackingSlider
- IOS中是使用libcurl注意事项
- poj 2986 A Triangle and a Circle 圆与三角形的公共面积