您的位置:首页 > 其它

tchar.h及TCHAR数据类型介绍

2017-07-13 22:53 190 查看
并不是所有的Windows操作系统都支持UNICODE编码的API(例如早期的Windows98),
这就造成了两种结果:某些版本的Windows应该应用wchar_t来保存字符, 某些平台的Windows应该使用char类型来保存字符, 显然这两种类型的变量是无法混用的。
  
为了解决该问题, Windows从一开始设计Windows时, 就提供了一整套方案, 对于支持ASCII字符集的API函数, 函数使用字母A作为后缀;对于支持UNICODE字符集的API函数, 则使用字母W作为后缀。
例如:FormatMessage函数就提供了FormatMessageA和FormatMessageW两个版本。

文档记载及我们使用的API函数, 实际是定义在Windows.h文件中的一组“宏”, 这组宏在UNICODE环境下将调用函数映射为后缀为W的函数;在ASCII环境下将调用函数映射为后缀为A的函数。

tchar.h头文件提供了一个数据类型TCHAR, 这个类型在UNICODE环境下将映射为wchar_t类型;在ASCII环境下映射为char类型。另外, tchar.h还提供了一组C语言字符串操作符的替代宏,
以_t开头, 例如_tcslen函数, 在UNICODE环境下被映射成为wcslen函数, 在ASCII环境下被映射成为strlen函数。

最后, tchar.h提供了_T宏, 该宏具有一个字符串类型参数, 在UNICODE环境下, 该宏会为字符串前面加上L符号。

[cpp] view plain copy

 print?

/ 定义宏UNICODE和_UNICODE, 一旦定义了该宏, C语言编译器将在UNICODE环境下工作    

// 注意, 一般情况下需要定义UNICODE宏和_UNICODE宏, 因为不同版本的C编译器要求不同    

    

// 在正式工作时, 并不需要定义这两个宏, 只需要在"项目属性->配置属性->字符集"中选择    

// UNICODE字符集或是多字节字符集即可, 开发环境会自动定义相应的宏    

#if !defined(UNICODE)    

#define UNICODE    

#endif    

    

#if !defined(_UNICODE)    

#define _UNICODE    

#endif    

    

// 在所有头文件之前包含tchar.h头文件    

// 这是程序可以应用各类替代宏的基础    

#include <tchar.h>    

#include <locale.h>    

#include <stdio.h>    

#include <stdlib.h>    

#include <windows.h>    

    

/**  

 * 显示一个字符, ASCII版本  

 * 参数:c, 要显示的字符变量  

 */    

void ShowCharacterA(char c)    

{    

    // 在ASCII版本中, 选用printf函数来显示字符串    

    printf("(A)字符 %c 占据空间 %d", c, sizeof(c));    

}    

    

/**  

 * 显示一个字符, UNICODE版本  

 * 参数:c, 要显示的字符变量  

 */    

void ShowCharacterW(wchar_t wc)    

{    

    // 在UNICODE版本中, 选用wprintf函数来显示UNICODE字符串    

    wprintf(L"(W)字符 %c 占据空间 %d", wc, sizeof(wc));    

}    

    

/**  

 * 显示一个字符串, ASCII版本  

 * 参数:lpcsz, 要显示的字符变量  

 */    

void ShowStringA(const char* lpcsz)    

{    

    // 在ASCII版本中, 选用printf函数来显示ASCII字符串,     

    // 选用strlen函数来测量字符串长度    

    printf("/n(A)字符串 %s 长度为%d", lpcsz, strlen(lpcsz));    

}    

    

/**  

 * 显示一个字符串, UNICODE版本  

 * 参数:lpcwsz, 要显示的字符变量  

 */    

void ShowStringW(const wchar_t* lpcwsz)    

{    

    // 在UNICODE版本中, 选用wprintf函数来显示UNICODE字符串,     

    // 选用wcslen函数来测量字符串长度    

    wprintf(L"/n(W)字符串 %s 长度为%d", lpcwsz, wcslen(lpcwsz));    

}    

    

    

////////////////////////////////////////////////////    

    

// 下面这一组编译器指令, 根据是否定义UNICODE(或_UNICODE)宏, 映射不同的函数    

// 可以删除#if和#endif之间的代码, 查看运行结果的变化, 思考产生这种变化的原因    

#if defined(UNICODE) | defined(_UNICODE)    

    

// 定义ShowCharacter宏映射到ShowCharacterW函数    

#define ShowCharacter ShowCharacterW    

    

// 定义ShowString宏映射到ShowStringW函数    

#define ShowString ShowStringW    

    

#else    

    

// 定义ShowCharacter宏映射到ShowCharacterA函数    

#define ShowCharacter ShowCharacterA    

    

// 定义ShowString宏映射到ShowStringA函数    

#define ShowString ShowStringA    

    

#endif    

    

////////////////////////////////////////////////////    

    

// 定义缓冲区长度为512个字符    

#define BUF_LEN 512    

    

int _tmain(int argc, TCHAR* argv[])    

{    

    // 定义变量, 保存字符    

    TCHAR c = _T('A');    

    

    // 定义字符数组, 保存字符串    

    TCHAR szStr[] = _T("ABC大家好");    

    

    // 定义指向字符串的指针    

    TCHAR* lpszStr = _T("Hello你好");    

    

    // 定义指向字符串的常量指针    

    const TCHAR* lpcszStr = _T("GoodBye再见");    

    

    int bSame;    

    

    // 定义BUF_LEN长度的字符数组作为缓冲区    

    TCHAR szBuffer[BUF_LEN] = _T("");           

    

    // 定义ASCII字符集缓冲区    

    char szBufferA[BUF_LEN] = "";    

    

    // 定义UNICODE字符集缓冲区    

    wchar_t szBufferW[BUF_LEN] = L"";    

    

    // 定义错误代码22    

    const int nError = 22;    

    

    // 设置语言环境为中文    

    _tsetlocale(LC_ALL, _T("zhi"));    

    

    // 调用ShowCharacter宏    

    ShowCharacter(c);    

    

    // 调用ShowCharacter宏    

    ShowString(szStr);    

    ShowString(lpszStr);    

    ShowString(lpcszStr);    

    

    // _tcsicmp是tchar.h中定义的宏,     

    // 在不同的字符集环境下映射为stricmp或wcsicmp函数    

    bSame = _tcsicmp(lpszStr, lpcszStr);    

    

    if (bSame == 0)     

    {    

        // _tprintf是tchar.h中定义的宏, 在不同字符集环境下映射为printf或wprintf函数    

        _tprintf(_T("/n字符串 %s 与 %s 相同"), lpszStr, lpcszStr);    

    }     

    else     

        _tprintf(_T("/n字符串 %s 与 %s 不同"), lpszStr, lpcszStr);    

    

    // _tcscpy_s是tchar.h中定义的宏,    

    // 在不同字符集环境下映射为strcpy_s或wcscpy_s函数(_s表示安全版本函数)    

    _tcscpy_s(szBuffer, BUF_LEN, lpszStr);    

    

    // _tcscat_s是tchar.h中定义的宏,     

    // 在不同字符集环境下映射为strcat_s或wcscat_s函数(_s表示安全版本函数)    

    _tcscat_s(szBuffer, BUF_LEN, lpcszStr);    

    

    // _tcslen是tchar.h中定义的宏,     

    // 在不同字符集环境下映射为strlen或wcslen函数    

    _tprintf(_T("/n字符串 %s 长度为 %d"), szBuffer, _tcslen(szBuffer));    

    

    // 接下来, 我们看一下FormatMessage函数在不同环境下的应用    

    

    // ASCII环境下应用, 第5个参数使用char类型数组作为缓冲    

    FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, nError, 0, szBufferA, BUF_LEN, NULL);    

    printf("/n错误信息:%s", szBufferA);    

    

    // UNICODE环境下应用, 第5个参数使用wchar_t类型数组作为缓冲    

    FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, NULL, nError, 0, szBufferW, BUF_LEN, NULL);    

    wprintf(L"错误信息:%s", szBufferW);    

    

    // 自适应环境, 第5个参数使用TCHAR类型数组作为缓冲    

    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, nError, 0, szBuffer, BUF_LEN, NULL);    

    _tprintf(_T("错误信息:%s"), szBuffer);    

    

    _tprintf(_T("/n"));    

    system("pause");    

    return 0;    

}    

    wchar_t是C/C++的字符类型,是一种扩展的存储方式,wchar_t类型主要用在国际化程序的实现中,但它不等同于uni编码。uni编码的字符一般以wchar_t类型存储。

    char是8位字符类型,最多只能包含256种字符,许多外文字符集所含的字符数目超过256个,char型无法表示。

    wchar_t数据类型一般为16位或32位,但不同的C或C++库有不同的规定,如GNU Libc规定wchar_t为32位,总之,wchar_t所能表示的字符数远超char型。

    标准C++中的wprintf()函数以及iostream类库中的类和对象能提供wchar_t宽字符类型的相关操作。

转自:http://blog.csdn.net/gvfdbdf/article/details/48597407
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: