1 字符编码
1.1编码的历史
1.1.1ASCII码
0=127 7位表示
1.1.2ASCII扩展码
0—255 8为表示。
代码页:通过代码也来切换对应的字符(数字表示)
1.1.3双字节字符集DBCS
使用一个或两个字节表示字符。
1.1.4Unicode编码
全部使用2个字节表示字符
内存 硬盘等资源占用变大。对编码支持度大。
字符集
1.2C 语言和编码
1.2.1单字节的字符和字符串
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(""); }
1.2.2宽字节的字符
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); }
1.2.3定义通用字符函数
为了程序中可以方便的支持宽字节和多字节字符,使用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 }
1.1.1Unicode的控制台打印
将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); }