windows应用程序开发系列四:宽字符问题详解

一、上节遗留的问题

上节的程序中,wprintf()并不能在屏幕上打印出来我们指定的中文字符串,而printf()却能正确的打印出来正确的中文字符串,这是为什么呢?

我们都知道,char类型采用DBCS的编码方式,用1个8位代表代表一个英文字符,而用2个8位代表一个中文字符。而wchar_t类型采用UNICODE的编码方式,这种编码方式所有的字符统统占用2个字节的空间,所以一个英文字符占用16位,一个汉字也占16位空间,全球任意国家通用的。所以在打印的时候,必须指明国家,说明是那个国家的文字。那么如何解决呢?这里有两种方式。

1 指定中文方法是setlocale(LC_ALL,"chs");使用这个函数必须包含头文件"locale.h";

2 使用WriteConsole()函数,具体原型如下:

BOOL WriteConsole(
  HANDLE hConsoleOutput,           // 标准输出设备句柄
  CONST VOID *lpBuffer,            // 输出内容buf
  DWORD nNumberOfCharsToWrite,     // 输出内容长度
  LPDWORD lpNumberOfCharsWritten,  // 实际输出内容长度
  LPVOID lpReserved                // 备用,为NULL
);

二、代码实践——打印所有的中文字符,这里提供两套代码,供大家参考。

</pre><pre name="code" class="cpp">#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
#include "locale.h"

void PrintUnicode()
{
	for (WORD nHigh = 0; nHigh < 256; nHigh++)
	{
		for(WORD nLow = 0; nLow < 256; nLow++)
		{
			wchar_t Wchar = nHigh*256 + nLow;
			wprintf(L"%s",&Wchar);
		}
		printf("\n");
	}
}
int main(int argc, char* argv[])
{
	setlocale(LC_ALL,"chs");
	PrintUnicode();		
	return 0;
}
程序运行界面截图


利用GetStdHandle()函数来得到三个标准句柄,即标准输出句柄,标准输入句柄,和标准错误句柄。在调用WriteConsole()函数的时候,第一个参数就是标准输出句柄,需要使用GetStdHandle()函数获取,该函数的原型如下:

HANDLE GetStdHandle( DWORD nStdHandle );函数参数的取值如下:

STD_INPUT_HANDLE

STD_OUTPUT_HANDLE

STD_ERROR_HANDLE


#include "stdafx.h"
#include "windows.h"
#include "stdio.h"

void PrintUnicode()
{
	HANDLE hStd = GetStdHandle(STD_OUTPUT_HANDLE);
	for (WORD nHigh = 0; nHigh < 256; nHigh++)
	{
		for(WORD nLow = 0; nLow < 256; nLow++)
		{
			wchar_t Wchar = nHigh*256 + nLow;
			WriteConsole(hStd,&Wchar,1,NULL,NULL);
		}
		printf("\n");
	}
}
int main(int argc, char* argv[])
{
	PrintUnicode();		
	return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值