《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宏的时候的代码与运行结果
当定义UNICODE宏的时候的代码与运行结果
为什么会出现乱码呢?
因为#ifdef 与#ifndef有向上溯源性。当编译器编译到
没有定义#define UNICODE 的时候TCHAR类型是char型,因为#ifdef 与#ifndef有向上溯源性,所以编译器没有看到有定义过UNICODE宏,所以得知hello是窄字节,然后继续编译到
修改方法:将#define UNICODE 写在#include<windows.h>之前。
修改之后的代码与运行结果:
#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字符
windows操作系统中三个不是用来找到内存的句柄 : 标准输出句柄,标准输入句柄,标准错误句柄
将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;
}
运行结果: