zoukankan      html  css  js  c++  java
  • Windows编程中UNICODE和_UNICODE定义问题

    Windows编程中UNICODE和_UNICODE定义问题

    先转一篇文章:

     

    初学Windows SDK编程时碰到过这个问题,相信很多初学Windows编程的人也都碰到过,后来慢慢搞明白些了,但有时别人问到自己也说不太 清楚。今天借此机会,我也好好整理一下自已的思路,用下面这篇文章详细点地解释下这个问题,希望能帮助到有此疑问的朋友。

    UNICODE和_UNICODE并不是在头文件中“定义”的,而是程序员通过以下方法之一定义的:
    1、用代码定义的,就像你上面的一样;
    2、编译选项中指定。比如在VC中是:

    Project->Settings->C/C++->Category->Preprocessor->Preprocessor definitions

    这里是预处理指令,还有一些其它常见的常量如:WIN32,_DEBUG,NDEBUG,_WINDOWS等。

    所以你在头文件中找不到它的定义(注意是定义,不是使用,使用的地方则很多)。

    但这两个符号对Windows程序却是有特定含义的,也就是说你不能将UNICODE定义为:Unicode,unicode,UseUnicode...否则毫无作用。因为在很多的头文件中,这两个符号用来判断:

    1、用那一种编码方式,即Unicode和单字节;
    2、一些Windows中特定的类型的含义;
    3、根据即Unicode和单字节编码的不同而选择不同组的字符处理函数。

    例如_UNICODE的例子你可以在TCHAR.H中找到,它用来解析TCHAR等类型是宽字符还是单字节字符,以及一些字符串宏的处理结果是宽字符还是单字节,比如:

    #ifdef  _UNICODE                   
    typedef wchar_t TCHAR ;
    #else 
    typedef char TCHAR ;
    #endif

    还有类似的方式定义的宏:
    _TEXT ("Hello!") , _T ("Hello!") , TEXT ("Hello!") , L ("Hello!") 

    上面的宏全是一个意思:如果是UNICODE,则算是是宽字符;否则处理为传统单字节ASCII字符。

    UNICODE在很多头文件中和_UNICODE一样用来解析TCHAR等类型是宽字符还是单字节字符,例如WINNT.H中:

    #ifdef  UNICODE                   
    typedef WCHAR TCHAR, * PTCHAR ;
    typedef LPWSTR LPTCH, PTCH, PTSTR, LPTSTR ;
    typedef LPCWSTR LPCTSTR ;
    #else 
    typedef char TCHAR, * PTCHAR ;
    typedef LPSTR LPTCH, PTCH, PTSTR, LPTSTR ;
    typedef LPCSTR LPCTSTR ;
    #endif

    同时用来选择字符处理函数,例如WINUSER.H中:

    #ifdef UNICODE
    #define MessageBox  MessageBoxW
    #else
    #define MessageBox  MessageBoxA
    #endif 

    这 样,我们只用一种类型(比如TCHAR)和一组函数(比如MessageBox)就方便地可以处理两种编码的程序,而不用去条件判断应该用char还是 wchar_t,应该用MessageBoxA还是MessageBoxW。这些细节Windows.h等头文件中已经为我们考虑了,我们要做的只是在需 要用Unicode时定义两个符号。

    而另一方面,Windows.h经过辗转#include,又将WINNT.H、WINUSER.H 等很多头文件包含了进去,很多地方还有重复交叉的(当然用条件编译过滤过了),所以两个符号(UNICODE、_UNICODE)都要定义,否则像上面少 定义了一个的话,结果将很难预料。

     

     

    总结:有了这些以就可以通过宏(也就是像:_T,LPTSTR,LPCTRSTR之类的带有T这个标志的)来再ASCII和UNICODE之间转换了。程序可移植性很强了。
  • 相关阅读:
    gc buffer busy/gcs log flush sync与log file sync
    给Oracle年轻的初学者的几点建议
    Android 编程下帧动画在 Activity 启动时自动运行的几种方式
    Android 编程下 Touch 事件的分发和消费机制
    Java 编程下 static 关键字
    Java 编程下 final 关键字
    Android 编程下模拟 HOME 键效果
    Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated ?
    Extjs4 大型项目目录结构重构
    [转]SQLServer 2008 允许远程连接的配置方法
  • 原文地址:https://www.cnblogs.com/likeFlyingFish/p/5346016.html
Copyright © 2011-2022 走看看