走进windows编程的世界-----字符编码

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系统功能,也有xxxAxxxW两种对其操作的Win32 API,下面以WriteConsole为例。它也存在WriteConsoleAWriteConsoleW两上版本,但我们在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值