標籤:字元編碼 unicode 多位元組
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 _UNICODEint nLen = strlen(pszText);#elseint 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);}