关于unicode的疑问for myself(转)

 

从网上看到VS2010使用的时候一些问题:

大家帮我看下
明明使用了 _T(text)
为什么还是出错呢?

编译错误。
      _T只能把字符串文字量(也就是双引号括起来的字符串)或者字符文字量(也就是单引号括起来的字符)转化为所需的样子。它无法把一个CHAR转化为一个TCHAR,也无法把一个LPSTR转化为一个LPTSTR。为什么会这样呢?答案是:因为C++语法。


      目前的C++语法,支持两种字符串。一种是直接用引号括起的,比如"Hello, World.",另一种是用引号括起,前面再加一个字母L的,比如L"Hello, World."。前一种字符串的类型是char*,或者说是const char*,后一种字符串的类型是wchar_t*,或者说是const wchar_t*。


     在Visual Studio 2010中,_T是一个宏。它的作用是:如果当前的工程设置是Unicode,则在前面加一个L,否则就什么也不加。换句话说,如果工程设置为Unicode,_T("a")就相当于L"a",否则,_T("a")就相当于"a"。楼主写一个_T(text),如果工程设置为Unicode,就变成了Ltext,于是编译就出错了:没有Ltext这个变量。

      如何解决?
      方法1、如果是从Visual Studio 6.0升级过来的代码,因为它的工程默认设置不是Unicode的,而Visual Studio 2010的工程默认设置是Unicode的,造成问题。遇到这种情况,直接在Visual Studio 2010里面修改工程设置为不是Unicode即可。
      方法2、对于那个函数而言,可以调用TextOut的非Unicode版本。
TextOut(xdc,x,y,_T(text),strlen(text));
修改为
TextOutA(xdc,x,y,text,strlen(text));

 

     strcpy、wcscpy与_tcscpy

       C++标准库函数提供了字符和字符串的操作函数,并提供了其UNICODE版本,如:

       char *strcpy(char *strDestination, const char *strSource); 
       wchar_t *wcscpy(wchar_t *strDestination, const wchar_t *strSource);

       wcscpy()即为strcpy()的宽字符版本,与_T类似的,Visual C++提供了类似的同名函数:

#ifdef  UNICODE      
    #define _tcscpy     wcscpy
#else     
    #define _tcscpy     strcpy
#endif

     因此我们建议这样书写代码:

TCHAR src[] = _T("学习C++"); 
TCHAR dest[20]; 

_tcscpy(dest, src);

    比如,在使用printf()的时候,我会尝试使用_tprintf()。

    同样的版本问题一样会困扰着main()函数:

   main( int argc, char *argv[ ], char *envp[ ]); 
   wmain( int argc, wchar_t *argv[ ], wchar_t *envp[ ]);

再来看_tmain()的定义:

#ifdef  UNICODE      
   #define _tmain      wmain     
   #define _tWinMain   wWinMain 
#else    
   #define _tmain      main     
   #define _tWinMain   WinMain 
#endif
    这就是为什么Win32控制台项目默认输出,提供一个_tmain()函数的缘故。

posted @ 2012-08-01 15:54  玄色青春  Views(208)  Comments(0)    收藏  举报