并不是所有的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符号。
- / 定义宏UNICODE和_UNICODE, 一旦定义了该宏, C语言编译器将在UNICODE环境下工作
-
-
-
-
- #if !defined(UNICODE)
- #define UNICODE
- #endif
-
- #if !defined(_UNICODE)
- #define _UNICODE
- #endif
-
-
-
- #include <tchar.h>
- #include <locale.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <windows.h>
-
-
-
-
-
- void ShowCharacterA(char c)
- {
-
- printf("(A)字符 %c 占据空间 %d", c, sizeof(c));
- }
-
-
-
-
-
- void ShowCharacterW(wchar_t wc)
- {
-
- wprintf(L"(W)字符 %c 占据空间 %d", wc, sizeof(wc));
- }
-
-
-
-
-
- void ShowStringA(const char* lpcsz)
- {
-
-
- printf("/n(A)字符串 %s 长度为%d", lpcsz, strlen(lpcsz));
- }
-
-
-
-
-
- void ShowStringW(const wchar_t* lpcwsz)
- {
-
-
- wprintf(L"/n(W)字符串 %s 长度为%d", lpcwsz, wcslen(lpcwsz));
- }
-
-
-
-
-
-
- #if defined(UNICODE) | defined(_UNICODE)
-
-
- #define ShowCharacter ShowCharacterW
-
-
- #define ShowString ShowStringW
-
- #else
-
-
- #define ShowCharacter ShowCharacterA
-
-
- #define ShowString ShowStringA
-
- #endif
-
-
-
-
- #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;
-
-
- TCHAR szBuffer[BUF_LEN] = _T("");
-
-
- char szBufferA[BUF_LEN] = "";
-
-
- wchar_t szBufferW[BUF_LEN] = L"";
-
-
- const int nError = 22;
-
-
- _tsetlocale(LC_ALL, _T("zhi"));
-
-
- ShowCharacter(c);
-
-
- ShowString(szStr);
- ShowString(lpszStr);
- ShowString(lpcszStr);
-
-
-
- bSame = _tcsicmp(lpszStr, lpcszStr);
-
- if (bSame == 0)
- {
-
- _tprintf(_T("/n字符串 %s 与 %s 相同"), lpszStr, lpcszStr);
- }
- else
- _tprintf(_T("/n字符串 %s 与 %s 不同"), lpszStr, lpcszStr);
-
-
-
- _tcscpy_s(szBuffer, BUF_LEN, lpszStr);
-
-
-
- _tcscat_s(szBuffer, BUF_LEN, lpcszStr);
-
-
-
- _tprintf(_T("/n字符串 %s 长度为 %d"), szBuffer, _tcslen(szBuffer));
-
-
-
-
- FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, nError, 0, szBufferA, BUF_LEN, NULL);
- printf("/n错误信息:%s", szBufferA);
-
-
- FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, NULL, nError, 0, szBufferW, BUF_LEN, NULL);
- wprintf(L"错误信息:%s", szBufferW);
-
-
- 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