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);
}
1.1Win32 程序与编码
1.1.1WIN32 API的定义
每个API对多字节字符和UNIcode分别有不同的版本。
MessageBox
MessageBoxA : 多字节字符支持
MessageBoxW : UNIcode 字符支持
1.1.2字符的定义
使用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