0=127 7位表示
0—255 8为表示。
代码页:通过代码也来切换对应的字符(数字表示)
使用一个或两个字节表示字符。
全部使用2个字节表示字符
内存 硬盘等资源占用变大。对编码支持度大。
字符集
Char cText = ‘A’;
Char * pszText =“ABCD”
void ASCII() { char ctext = 0; for( int nindex = 0; nindex < 256; nindex ++){ printf(" %c ",ctext); ctext ++ ; } puts(""); } void c_char() { char *psztext = "Hello Worlf\n"; int nlen = strlen(psztext); printf("nlen = %d,pszchar = %s",nlen,psztext); }
void CoadPage(int nCodePage) { SetConsoleOutputCP(nCodePage); char ctext = 0; for( int nindex = 0; nindex < 256; nindex ++){ printf(" %c ",ctext); ctext ++ ; } puts(""); }
Wchar_t cText = ‘A’;
Wchar_t *pszText= L”ABCD”
void C_wchar() { wchar_t cText = 'A'; wchar_t *pszText = L"ABCD"; /*双字节Uncode字符*/ int nlen = wcslen(pszText); /*只能打印出A来,无法打印全*/ printf("%s\n",pszText); /*可打印完成的字符串*/ wprintf(L"%s,len = %d\n",pszText,nlen); /*多字节字符*/ char * pszChs = "我是程序员"; nlen = strlen(pszChs); printf("%s,len=%d",pszChs,nlen); }
为了程序中可以方便的支持宽字节和多字节字符,使用TCHAR 来定义,基本实现思路如下。
#ifndef _UNICODE
typedef char TCHAR
#define _T(x) x
#else
typedefwchar_t TCHAR
#define _t(x) L##x //## 连¢?接¨®符¤?
#endif
void tchat() { TCHAR * pszText = __T("我是程序员"); #ifndef _UNICODE int nLen = strlen(pszText); #else int nLen = wcslen(pszText); #endif }
将Unicode 字符串输出到控制台上。参考资料:http://blog.sina.com.cn/s/blog_4e3197f20100a7v3.html
同样,Windows控制台也是标准的UNICODE系统功能,也有xxxA,xxxW两种对其操作的Win32 API,下面以WriteConsole为例。它也存在WriteConsoleA和WriteConsoleW两上版本,但我们在MSDN中找不到这两个原型型,可以在C:\ProgramFiles\Microsoft Visual Studio\VC98\Include\WINCON.H在可以发现它的定义,并可以发现对它们进行控制的预定义语句。
#ifdefUNICODE
#defineWriteConsole WriteConsoleW
#else
#defineWriteConsole WriteConsoleA
#endif
void PrintUnicode() { /*根据需要获取的句柄类型设置参数为 * STD_INPUT_HANDLE(标准输入句柄) * STD_OUPUT_HANDLE(标准输出句柄) * STD_ERROR_HANDLE(标准错误句柄), * 函数返回值。句柄值。 */ HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); wchar_t * pszText = L"我是程序员\n"; /* *BOOL WINAPI WriteConsole( * HANDLE hConsoleOutput, 控制台句柄,应该为标准输出句柄 * * const VOID* lpBuffer,输出的内容的指针 * * DOWRD nNUmberOfCharsToWrite,输出的字符的数量 * * DOWRD lpNumberOfCharsWritten 输出参数,用于返回实际输出的字符数 * * LPVOID lpReserved);保留参数,必须设置为NULL */ WriteConsoleW(hOut,pszText,wcslen(pszText),NULL,NULL); }
每个API对多字节字符和UNIcode分别有不同的版本。
MessageBox
MessageBoxA : 多字节字符支持
MessageBoxW : UNIcode 字符支持
使用TEXT,由WinNT.h提供定义
#ifdef UNICODE
#define__TEXT(quote) L##quote
#else
#define__TEXT(quote) quote
#endif
TCHAT * pszText= TEXT(“ABCD”);
/*宽字节大多字节*/ void Wide2Multi() { WCHAR *pwszText = L"Wide2Multi"; /*计算转换后字符长的长度*/ int nLen = WideCharToMultiByte(CP_ACP,0,pwszText,wcslen(pwszText),NULL,0,NULL,NULL); char *pszText = (char *) malloc(nLen); WideCharToMultiByte(CP_ACP,0,pwszText,wcslen(pwszText),pszText,nLen,NULL,NULL); MessageBoxA(NULL,pszText,"",MB_OK); free(pszText); } /*多字节到宽字节(UNICODE)*/ void Multi2Wide() { CHAR * pszText = "Multi2Wide"; /*获得转换后字符的长度*/ int nLen = MultiByteToWideChar(CP_ACP,0,pszText,strlen(pszText),NULL,0); /*分配内存*/ WCHAR *pwszText = (WCHAR *)malloc(nLen * sizeof(WCHAR)); memset(pwszText,0,sizeof(nLen * sizeof(WCHAR))); MultiByteToWideChar(CP_ACP,0,pszText,strlen(pszText),pwszText,nLen); MessageBoxW(NULL,pwszText,L"wide",MB_OK); free(pwszText); }
http://blog.csdn.net/shuilan0066/article/details/7951607