Windows编程中UNICODE和_UNICODE定义问题

1 篇文章 0 订阅
先转一篇文章:

 

我初学Windows SDK编程时也碰到过这个问题,相信很多初学Windows编程的人也都




碰到过,后来慢慢搞明白些了,但有时别人问到自己也说不太 清楚。今天



借此机会,我也好好整理一下自已的思路,用下面这篇文章详细点地解释下这个问题,




希望能帮助到有此疑问的朋友。




UNICODE和_UNICODE并不是在头文件中“定义”的,而是程序员通过以下方法之一定


义的:


1、用代码定义的,就像你上面的一样;


2、编译选项中指定。比如在VC中是:



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

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


INDOWS等。




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



但这两个符号对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之间转换了。程序可移植性很强了。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言Unicode可以通过使用宽字符类型来实现,例如wchar_t类型。Unicode字符可以表示为16位或32位整数。在C语言,可以使用宽字符常量L"unicode字符"来表示Unicode字符,宽字符字符串可以使用L"unicode字符串"来表示。可以使用标准库函数来处理宽字符,例如wprintf和wcscpy等函数。还可以使用特殊的转义序列来表示Unicode字符,例如\uXXXX,其XXXX是4位十六进制数,表示相应的Unicode字符的码点值。 ### 回答2: Unicode是一种用于表示和处理字符的编码标准。它通过为每个字符分配一个唯一的数字码点来实现,从而允许在计算机系统上存储、检索和显示各种语言的字符。 C语言作为一种通用的编程语言,也通过一些库和函数来支持Unicode编码。在C语言,通常使用16位宽度的字符类型`wchar_t`来表示Unicode字符,对应的库函数也用`w`作为前缀,例如`wprintf`和`wscanf`。 C语言提供了一些函数用于处理Unicode字符的输入和输出,比如`getwchar`和`putwchar`可以用来读取和输出一个宽字符。而对于字符串操作,可以使用`wcslen`和`wcscpy`等函数进行。 此外,在C语言还有一些宏定义用于处理宽字符字符串的格式输出,例如`%ls`用于格式化输出宽字符串,`%lc`用于格式化输出宽字符。 需要注意的是,为了正确处理Unicode字符,还需要在编译器和操作系统环境设置相关的编码支持。一般来说,在Windows平台上,可以使用`SetConsoleOutputCP`函数来设置控制台输出的编码格式为Unicode。 总之,C语言虽然原生支持的字符串是以ASCII编码为基础的,但通过使用宽字符类型和相关的库函数,我们可以在C语言处理和操作Unicode字符。 ### 回答3: C语言支持unicode编码,它允许程序员在代码使用各种语言和字符集,实现跨语言和跨平台的开发。 Unicode是一种全球统一的字符编码标准,它为每个字符分配了唯一的代码点。在C语言,字符类型(char)只能表示8位字符,而Unicode字符可能需要更多的字节来表示。为了解决这个问题,C语言引入了一个新的字符类型wchar_t,它的大小足够存储Unicode字符。 为了在C语言处理Unicode字符,我们可以使用宽字符函数(wide-character functions),这些函数以"w"开头,并且接受wchar_t类型的参数。例如,可以使用wprintf函数来打印Unicode字符到终端。 此外,C语言还提供了一些转换函数,用于在宽字符和多字节字符之间进行转换。可以使用mbstowcs函数将多字节字符转换为宽字符,或者使用wcstombs函数将宽字符转换为多字节字符。 在C语言,可以使用L前缀来定义宽字符常量。例如,L''表示一个宽字符常量。 虽然C语言原生支持Unicode编码,但是在处理Unicode字符串时还需要注意字符串的长度以及内存分配的问题,以确保正确地处理和存储Unicode字符。 总之,C语言通过宽字符函数和转换函数的支持,使得程序员可以在代码使用Unicode字符,实现更加灵活和全球化的开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值