Windows/MFC,C++中的TCHAR体系/char体系/WCHAR体系及其相互转换

</pre><pre>

Windows/MFC,C++编程中经常遇到UNICODE、ANSI字符串,并需要对这些字符串进行转换,本文对这些体系与其转换进行了总结。

第一篇:基础篇

3大体系常用函数及解析详见博文:http://blog.csdn.net/u010003835/article/details/47344775 

此外,接下来我书写的函数以Windows对char*,TCHAR*,const  TCHAR*的命名规则来书写

不熟悉的童鞋可以参考博文: http://blog.csdn.net/u010003835/article/details/47604553

TCHAR类型,根据环境判断选择字符集 

所需要的字符串转换宏:

 _T()/ TEXT() 根据当前环境对字符串进行转换

其与L的区别见博文: http://blog.csdn.net/u010003835/article/details/47606621

 代表函数及其正确使用方法示例:

LPTSTR temp_t = new TCHAR[MAXN]; 

temp_t[0] = 0; 

_tcscpy(temp_t, _T("Hi, Kemeng~")); 

_tprintf(_T("_tprintf: %s\n"), temp_t); 

delete[] temp_t;

 

WCHAR类型,使用UNICODE编码

所需要的字符串转换宏:L"XXXX" ,将当前字符串编码为UNICODE格式

测试代码:

LPWSTR temp_w = new WCHAR[MAXN];

temp_w[0] = 0;

wcscpy(temp_w, L"Hi, Kemeng~");

wprintf(L"wprintf: %s\n", temp_w);

delete[] temp_w;

常见的错误:

第一种:

wprintf("%s", L"AAAAAA");

另一种:

wprintf(L"%s", "AAAAAA");

正确写法:

wprintf(L"%s", L"AAAAAA");

wcout 貌似更智能一些,会对原始字符串进行转换,估计通过重载,测试后在进行补充

ASCII编码,

不需要字符串转换宏

示例代码

	LPSTR temp_c = new char[MAXN];
	temp_c[0] = 0;
	strcpy(temp_c, "Hi, Kemeng~");
	printf("printf: %s\n", temp_c);
	delete[] temp_c;

第二章:进阶篇

WCHAR,TCHAR,char类型字符串之间的转换:

方法一:使用A2T等宏。

宏的名称含义请参见博文:

http://blog.csdn.net/u010003835/article/details/47609975

如果使用这些宏需要包含头文件:

#include <atlbase.h>

并且要声明

USES_CONVERSION;//T2A,A2T,W2T,W2A,A2CW等支持,需要进行此声明

完整的测试代码:

#include <iostream>
#include <windows.h>
#include <atlbase.h>
#include <tchar.h>
using namespace std;

#define MAXN 255

#pragma warning(disable:4996)

int main(){
	USES_CONVERSION;	//T2A,A2T,W2T,W2A,A2CW等支持,需要进行此声明

	//T2A. TCHAR字符串 到 char字符串的转换。
	cout << endl << "TCHAR Convertion to char use T2A" << endl;
	LPTSTR name1_t = _T("Hi, KeMeng~");
	LPSTR temp1_c = NULL;
	temp1_c = T2A(name1_t);

	_tprintf(_T("%s\n"), name1_t);
	printf("%s\n",temp1_c);
	cout << "--------------------------" << endl;

	//A2T. char字符串 到 TCHAR字符串的转换
	cout << endl << "char Convertion to TCHAR use A2T" << endl;
	LPSTR name2_c = "Hi, KeMeng~";
	LPTSTR temp2_t = A2T(name2_c);
	printf("%s\n", name2_c);
	_tprintf(_T("%s\n"), temp2_t);
	cout << "--------------------------" << endl;

	//W2T. WCHAR字符串 到 TCHAR字符串的转换
	cout << endl << "WCHAR Convertion to TCHAR use W2T" << endl;
	LPWSTR name3_w = L"Hi, KeMeng~";
	LPTSTR temp3_t = T2W(name3_w);
	wprintf(L"%s\n", name3_w);
	_tprintf(_T("%s\n"), temp3_t);
	cout << "--------------------------" << endl;

	//W2T. WCHAR字符串 到 const char字符串的转换
	cout << endl << "WCHAR Convertion to const CHAR use W2CA" << endl;
	LPWSTR name4_w = L"Hi, KeMeng~";
	LPCSTR temp4_a = W2CA(name4_w);
	wprintf(L"%s\n", name4_w);
	printf("%s\n", temp4_a);
	cout << "--------------------------" << endl;

	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-30 09:24:57

Windows/MFC,C++中的TCHAR体系/char体系/WCHAR体系及其相互转换的相关文章

MFC中cstring,string和char[]的相互转化

int 转 CString:CString.Format("%d",int);...............................string 转 CString CString.format("%s", string.c_str()); 用c_str()确实比data()要好. .......................................char* 转 CString CString.format("%s", cha

char,wchar_t,WCHAR,TCHAR,ACHAR的区别----LPCTSTR

转自http://blog.chinaunix.net/uid-7608308-id-2048125.html 简介:这是DWORD及LPCTSTR类型的了解的详细页面,介绍了和类,有关的知识,加入收藏请按键盘ctrl+D,谢谢大家的观看!要查看更多有关信息,请点击此处 首先声明,这都是在网上找的资料,我再整理修改的: 一:关于DWORD DWORD就是32bit的unsigned  long无符号长整型,DWORD是双字类型 ,4个字节,API函数中有很多参数和返回值是DWORD的. 二:如何

强行在MFC窗体中渲染Cocos2d-x 3.6

[前言] 把Cocos2dx渲染到另一个应用程序框架中的方法,在2.x中有很多大神已经实现了,而3.x的做法网上几乎找不着.这两天抽空强行折腾了一下,不敢独享,贴出来供大家参考. [已知存在的问题] 程序退出时会发生非常严重的内存泄漏,博主检查了很久,但技术不够暂时无法解决.如果有大神能搞定,求告知一下做法,谢谢! 在程序从开始运行到关闭期间,有且仅有一个cocos2dx窗体存在时可以选择性无视内存泄漏.如果非常在意这一点,建议使用cocos2d-x 2.2.6这个版本,放在MFC中的内存泄漏很

(转载)强行在MFC窗体中渲染Cocos2d-x 3.6

强行在MFC窗体中渲染Cocos2d-x 3.6 GuyaWeiren2015-06-29 15:14:063696 次阅读 [前言] 把Cocos2d-x渲染到另一个应用程序框架中的方法,在2.x时代有很多大神已经实现了,而3.x的做法网上几乎找不着.这两天抽空强行折腾了一下,不敢独享,贴出来供大家参考. [已知存在的问题] 程序退出时会发生非常严重的内存泄漏,博主检查了很久,但技术不够暂时无法解决.如果有大神能搞定,求告知一下做法,谢谢! 在程序从开始运行到关闭期间,有且仅有一个Cocos2

VC/MFC开发中的句柄HWND

Windows开发中,经常会碰到一个常见的字眼HWND,如下 HWND hWnd; hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); HWND就是句柄,那么句柄是什么? [句柄定义] 先看Windows下面的定义,如下 DECLARE_HANDLE (HWND)

非MFC工程中使用MFC库

需求说明 C++工程的类型有很多,从VS(或VC)可以看到常见的有:Win32 Console Application.MFC Application.Win32 Project等.在创建MFC工程时,通过IDE的向导会自动帮我们创建相应的类文件和包含必需的头文件,但有时候我们需要在非MFC工程中包含MFC的库.至于为什么会有这个需要,为何不在一开始就创建MFC工程呢?可能有两种原因:1.在MFC工程会产生很多向导生成的代码以及资源文件,如基于单文档的工程会有View,Doc等类,很多时候我们并

MFC对话框中显示背景图片

在MFC对话框中显示图片,四个步骤. 1.首先得在VC6.0或者VS2008(其他版本也是一样)中导入GDI文件.(网上下载:) GDI含义是图形设备接口,主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出. 分别将include文件夹和lib中的头文件全部添加到你的开发环境中的include或lib文件夹中.如:F:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include. 将gdiplus.dll导入

Windows MFC 全局模态 实现 (二)

上一篇 Windows MFC 全局模态 实现 介绍了一下第一种方法,但是这个方法有个问题是,即使在对话框外不能点击,框外点击鼠标,当前需要操作的窗口也是失去了焦点的.这样用户体验影响比较严重.而且还有个问题是,如果要适配32位.64位系统,要达到全局模态(禁止鼠标效果)需要32.64位两种库,而且要分别被32.64位系统调用.使用条件限制比较严格. 所以这里记录一下使用透明窗口的实现方法: 1.工程中插入一个对话框 2.设置对话框属性 去掉Title bar的勾 3.增加一个OnInitDia

Visual C++中的TCHAR

为了使代码兼容ASCII码和Unicode编码,微软公司还提供了通用字符类型TCHAR. 通用字符类型的含义是,如果在项目属性中选择"Unicode字符集",则TCHAR代表WCHAR,或者在项目中选择"多字符集",则TCHAR代表char. 喜欢刨根问底的读者,可以在一个使用了TCHAR的项目中,在TCHAR上单击鼠标右键,选择"转到定义",然后仔细查看随后打开的winnt.h中的内容.这里需要C语言中的条件预处理命令的知识.特别要注意的是,对