win32编程 编码问题

来源:互联网 发布:mac虚拟机打游戏 编辑:程序博客网 时间:2024/06/08 06:50

一、NMAKE和Makefile
NMAKE - 命令解释器,根据Makefile文件中定义的脚本,完成项目的编译等操作
Makefile - 定义编译/链接等脚本语言

/////////////////////////////////////////////////////////////////////////

Makefile文件的编写
新建Makefile.mak文件记事本打开写入

window.exe:window.obj //依赖行,根据obj是否被修改过判断是否重新生成exe
 cl.exe window.c /c      //命令行,前面必须用tab键
 link.exe window.obj user32.lib

dos中输入命令nmake /f Makefile.mak
此时生成window.obj 和 window.exe
根据时间戳确定是否需要重新编译链接。间隔~2s

//////////////////////////////////////////////////////////////

利用宏定义替换
CPP=cl.exe          
CPP_FLAG="/c"
LINK32=link.exe
LINK_LIB=user32.lib

ALL:CLEAN
 @echo 正在组建
 $(CPP) $(CPP_FLAG) window.c  
 $(LINK32) $(LINK_LIB) window.obj /out:window.exe

CLEAN:
 @echo 正在删除
 del window.exe
INSTALL:

////////////////////////////////////////////////////////////////

执行过程
1.NMAKE首先找到第一个依赖行,根据依赖行之间的关系建立依赖树
例如    A:B
 B:C
 C:D
NMAKE会建立对应的依赖树
 A
 |-B
   |-C
     |-D
2.NMAKE执行D的命令行,依次执行父节点的命令行
3.在A的命令行执行结束后退出NMAKE
4.如果需要执行指定的依赖行需要在执行NMAKE时增加依赖行名称 如
 NMAKE /f Makefile.mak B   //<--指定从B执行

/////////////////////////////////////////////////////////////////
切换代码页实现字符输出SetConsoleCP函数 //头文件windows.h
BOOL SetConsoleCP(
  UINT wCodePageID   // code page
);

SetConsoleOutputCP函数  //修改控制台字符集函数
BOOL SetConsoleOutputCP(
  UINT wCodePageID   // code page
);

单字节字符和字符串 char cText='A';  char* pszText="ABCD";每个字符占一个字节
双字节字符 wchar_t cText='A';   wchar_t* pszText=L"ABCD"; 每个字符占两个字节
printf()打印不出字符串。因为假设A字符的双字节编码是0x0041,在内存中存放方式
是4100 printf在输出41后00被当做结束符,只能输出一个字符

宽字节字符的打印函数 wprintf(L"%s",ch);
C语言函数因为字符集的问题存在不同的版本
获取宽字节字符串长度的函数 wcslen(要求的字符串); //"ABCD"长度是4

TCHAR 为了程序中方便的支持Unicode和多字节字符等
所以使用TCHAR来定义字符和字符串
根据_UNICODE宏开关将TCHAR编译成不同字符类型
/////////////////////////////////////////////////////////////////
实现方法:
 #ifndef _UNICODE
     typedef char TCHAR
     #define _T(x) x
 #else
     typedef wchar_t TCHAR
     #define _T(x) L##x
 #endif
使用时添加 TCHAR.H 头文件支持,使用_UNICODE宏开关进行编译
在TCHAR.H 头文件前添加 #define _UNICODE 支持多编译器
///////////////////////////////////////////////////////////////////
定义方式 : TCHAR * pszText = _T("ABCD");
代码使用 :使用UNICODE宏开关,通知编译器选择编译的代码
     #ifndef _UNICODE
  int nlen = strlen(pszText);
     #else
  int nlen = wcslen(pszText);
     #endif
////////////////////////////////////////////////////////////////

Unicode 的控制台打印
WriteConsole函数为windows的API
Unicode为世界上所有语言的字符集

win32 API的定义
每个API对于多字节字符和UNICODE分别有不同的版本
MessageBox
 MessageBoxA 多字节字符
 MessageBoxW UNICODE字符
打开UNICODE开关
在StdAfx.h头文件中#include<windows.h>前加上#define UNICODE
字符的定义使用TEXT宏
TCHAR *pszText =TEXT("ABCD");

win32 字符转换函数
MultiByteToWideChar  
WideCharToMultiByte   (win32 day02PM0350)

0 0
原创粉丝点击