2013.7.29 学习笔记《windows核心编程》(四) 字符输出

《windows核心编程》(四)-----------2013.7.29

一、概念

字符集的应用

• TCHAR
#ifdef  UNICODE  // r_winnt
   typedef WCHAR TCHAR, *PTCHAR;
   #define __TEXT(quote) L##quote
 #else
   typedef char TCHAR, *PTCHAR;
   #define __TEXT(quote) quote  
 #endif

#ifdef / #ifndef 在本文件内有向上溯源性

当没有定义UNICODE宏的时候的代码与运行结果


// WinCharacter.cpp : 定义控制台应用程序的入口点。
//

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

void T_char()
{
	TCHAR *pszText = __TEXT("hello");
#ifdef UNICODE//#ifdef / #ifndef 在本文件内有向上溯源性
	wprintf(L"%s\n",pszText);
#else
	printf("simple : %s\n",pszText);
#endif

int _tmain(int argc, _TCHAR* argv[])
{
	T_char();
	return 0;
}





当定义UNICODE宏的时候的代码与运行结果
// WinCharacter.cpp : 定义控制台应用程序的入口点。
//

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

void T_char()
{
	TCHAR *pszText = __TEXT("hello");
#ifdef UNICODE
	wprintf(L"%s\n",pszText);
#else
	printf("simple : %s\n",pszText);
#endif



}

int _tmain(int argc, _TCHAR* argv[])
{
	T_char();
	return 0;
}



为什么会出现乱码呢?
      因为#ifdef 与#ifndef有向上溯源性。当编译器编译到
TCHAR *pszText = __TEXT("hello");
这行代码的时候,编译器就会直接跳入WinNT.h头文件中去找,TCHAR类型当#define UNICODE的时候是wchar_t类型,
没有定义#define UNICODE 的时候TCHAR类型是char型,因为#ifdef 与#ifndef有向上溯源性,所以编译器没有看到有定义过UNICODE宏,所以得知hello是窄字节,然后继续编译到

#ifdef UNICODE
	wprintf(L"%s\n",pszText);
#else
	printf("simple : %s\n",pszText);
#endif
的时候,继续向上溯源发现已经定义了UNICODE宏,所以使用wprintf()函数 去打印输出当然出现乱码。

修改方法:将#define UNICODE 写在#include<windows.h>之前。


修改之后的代码与运行结果:



•UNICODE字符打印
 Wprintf对UNICODE字符打印支持不完善。
 在Windows下使用WriteConsole API打印UNICODE字符

BOOL WINAPI WriteConsole(
  __in          HANDLE hConsoleOutput,//标准输出句柄
  __in          const VOID* lpBuffer,//输出内容的buffer
  __in          DWORD nNumberOfCharsToWrite,//准备输出的长度
  __out         LPDWORD lpNumberOfCharsWritten,//返回实际输出的长度
  LPVOID lpReserved			//备用参数
);

windows操作系统中三个不是用来找到内存的句柄 : 标准输出句柄,标准输入句柄,标准错误句柄

HANDLE WINAPI GetStdHandle(
  __in          DWORD nStdHandle
//STD_INPUT_HANDLE /STD_OUTPUT_HANDLE / STD_ERROR_HANDLE
);//返回获取具体的标准句柄

将UNICODE字符集中所有字符输出:

// WinCharacter.cpp : 定义控制台应用程序的入口点。
//

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


void PrintUnicode()
{
	HANDLE hStd = GetStdHandle(STD_OUTPUT_HANDLE);
	for(WORD nHight = 0;nHight < 256;nHight ++)
	{
		for(WORD nLow = 0;nLow < 256;nLow ++)
		{
			wchar_t wchar = nLow + 256 * nHight;
			WriteConsole(hStd,&wchar,1,NULL,NULL);
		}
		printf("\n");
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	PrintUnicode();

	return 0;
}


运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值