·C语言相关

  对应于char, C语言中也有宽字符内型wchar_t。wchar_t被定义为: typedef unsigned short wchar_t ;显然它是16位的。wchar_t类型的常字串应该这样写: L"hello" 。因此可以这样定义一个宽字符指针 wchar_t *pwc=L"hello";。
  对于字符串函数, C语言中也有两个版本。如对应于strlen有wcslen,wprintf是printf的宽字符版。当然这两个版本的函数使用各自类型的参数,原因是显然的,char和unsigned short 怎么能等同呢?编译器是不会放过你的。
  下表是对char,wchar_t相关内容的比较:

(测试环境:VC++6.0) char类型 wchar_t类型
类型大小(32位系统) 8位 16位
常量字符表示法 'A' L'A' 或 'A'
常量字符串表示法 'hello' L'hello'
一些使用方法 char c='A'; (c的值:0x41) wchar_t wc='A'; (wc的值:0x0041)
char* p='hello'; wchar_t* pw=L"hello";
sizeof sizeof("hello")=6 sizeof(L"hello")=12
计算长度 strlen("hello")=5 wcslen(L"hello)=5

  既然有两个版本的函数,如果我们想在程序中同时支持它们该怎么办?如果使用VC++,你只要在程序中包含tchar.h头文件,这个文件中提供了一些宏以兼容两种字符集。例如:

#ifdef _UNICODE
 typedef wchar_t _TCHAR;
 typedef wchar_t TCHAR;
 #define __T(x) L ## x
 #define _tprintf wprintf
 #define _tcslen wcslen
 ......
#else
 typedef char _TCHAR;
 typedef char TCHAR;
 #define __T(x) x
 #define _tprintf printf
 #define _tcslen strlen
 ......
#endif

#define _T(x) __T(x)
#define _TEXT(x) __T(x)

  我们只要使用TCHAR,_tpirntf,_tcslen,_TEXT等,就可以兼顾两种字符集。

·Windows相关

  Windows2000/NT完全支持Unicode,Windows98对Unicode支持很少。我们关心的是怎样编写程序,既可以编译为不支持Unicode,又可编译为支持Unicode。Windows SDK的头文件中定义了一些宏以完成这个任务。

typedef char CHAR ;
typedef wchar_t WCHAR ; // wc
typedef CHAR * PCHAR, * LPCH, * PCH, * NPSTR, * LPSTR, * PSTR ;
typedef CONST CHAR * LPCCH, * PCCH, * LPCSTR, * PCSTR ;
typedef WCHAR * PWCHAR, * LPWCH, * PWCH, * NWPSTR, * LPWSTR, * PWSTR ;
typedef CONST WCHAR * LPCWCH, * PCWCH, * LPCWSTR, * PCWSTR ;

  和标准C一样,windows C也使用TCHAR作为兼容的类型

#ifdef UNICODE
 typedef WCHAR TCHAR, * PTCHAR ;
 typedef LPWSTR LPTCH, PTCH, PTSTR, LPTSTR ;
 typedef LPCWSTR LPCTSTR ;
 #define __TEXT(quote) L##quote
#else
 typedef char TCHAR, * PTCHAR ;
 typedef LPSTR LPTCH, PTCH, PTSTR, LPTSTR ;
 typedef LPCSTR LPCTSTR ;
 #define __TEXT(quote) quote
#endif

  另外还有一个TEXT宏,等价于__TEXT宏:#define TEXT(quote) __TEXT(quote)。

  写Win32 SDK程序的时候常常在注册窗口类时使用如下代码:

if (!RegisterClass (&wndclass)) {
  MessageBox ( NULL, TEXT ("This program requires Winodws 2000/NT"), szAppName,            MB_ICONERROR) ;
  return 0 ;
}

  这样,当在Windows98下运行使用了Unicode的程序时,程序可以给出提示并退出。这段代码为什么在Win98下可以运行?因为MessageBox在存在Unicode的定义下,被替换为MessageBoxW,而MessageBoxW是Win98支持的少数宽字符Windows函数之一。
  总之,写Windows SDK程序时尽可能使用像TCHAR,PTSTR,LPCTSTR,TEXT这样的宏。

wchar_t解决一些8位表示不完的字符,在使用时wchar_t *p = L"ABC",L就表示是宽字符,windows下的_T,_TEXT都是解决这个问题,用的时候注意一下就行了

c++ wchar_t的更多相关文章

  1. VC++ : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>

    最近学习Google Breakpad,将其用在了自己的项目中,编译的版本为VS2010,没有什么问题.但是为了和之前的程序兼容,需要使用VS2008版本的程序,于是又编译了VS2008版本的代码,但 ...

  2. wchar_t内置还是别名?小问题一则(升级公司以前代码遇到的问题)

    问题: 原来的2008工程用2010编译后,运行程序出现无法定位程序输入点 *@basic_string@_WU@*和*@basic_string@G@* 解决: 关闭“语言选项”中“将WChar_t ...

  3. 彻底搞定char/wchar_t/unicode

    彻底搞定char/wchar_t!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (2013-07-17 10:18:28) 转载▼     从char/wchar_t到TCHAR(1) ...

  4. char、wchar_t、strlen、wcslen

    第一部分: strlen函数的宽字符版是wcslen(wide-character string length:宽字符串长度),并且在STRING.H(其中也说明了strlen)和WCHAR.H中均有 ...

  5. char 转wchar_t 及wchar_t转char

    利用WideCharToMultiByte函数来转换,该函数映射一个unicode字符串到一个多字节字符串.通常适合于window平台上使用. #include <tchar.h> #in ...

  6. char*,wchar_t*,CString和BSTR之间的转换

    前言 本文并不尝试列举出所有的转换方法,只列举作者认为方便易用的方法. 1.char*和wchar_t*的相互转换 可以利用中间类_bstr_t(头文件comdef.h)方便的进行相互转换 const ...

  7. c++中char*\wchar_t*\string\wstring之间的相互转换

    string U2A(const wstring& str)//Unicode字符转Ascii字符 { string strDes; if ( str.empty() ) goto __end ...

  8. Unichar, char, wchar_t

    之前总结了一些关于字符表示,以及字符串的知识. 现在在看看一些关于编译器支持的知识. L"" Prefix 几乎所有的编译器都支持L“” prefix,一个字符串如果带有L“”pr ...

  9. char,wchar_t,WCHAR,TCHAR,ACHAR的区别----LPCTSTR

    转自http://blog.chinaunix.net/uid-7608308-id-2048125.html 简介:这是DWORD及LPCTSTR类型的了解的详细页面,介绍了和类,有关的知识,加入收 ...

  10. Error LNK2019: unresolved external symbol "char * __stdcall _com_util::ConvertBSTRToString(wchar_t *)"

    Error 2 error LNK2019: unresolved external symbol "char * __stdcall _com_util::ConvertBSTRToStr ...

随机推荐

  1. REP-20147 Cannot implement column link for this detail SQL query. Converting to group link.

    注:本文为原创,作为学习交流使用,转载请标明作者及出处,作者保留追究法律责任的权力. Lumen Su lzsu1989#gmail.com (#=@) www.cnblogs.com/lzsu198 ...

  2. 英文版windows乱码问题(win7/8/10)

  3. NGUI 取ScrollView中遮罩区域4个点

    用panel.localCorners而不是panel.finalClipRegion,Region还要再换算 首先通过ScrollView取panel,然后取Corners,它返回值代表4个点,映射 ...

  4. 深入浅出FPGA-2-让source insight 支持verilog HDL

    引言 工欲善其事,必先利其器.最近用verilog在FPGA上做一个简易的计算器,整个工程由6个模块组成,之前写的代码都是很小的,模块也很少,一般就一两个,没感觉出别扭.但是模块多了就发现,模块之间的 ...

  5. thread_CountDownLatch同步计数器

    CountDownLatch类是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞程序继续执行 ...

  6. Git-git 忽略 IntelliJ .idea文件

    $ echo ‘.idea’ >> .gitignore $ git rm -rf .idea $ git add .gitignore

  7. 微信小程度腾讯地图SDK使用方法

    在开发过程中,不少人肯定遇到过要用到地图,那么在小程序里,腾讯也给出了相应的SDK供我们来使用.那么接下来,就介绍下如何使用该SDK实现获取经纬度然后显示当前用户所在地址 首先第一步:下载腾讯地图SD ...

  8. CCNA2.0笔记_OSI模型

    OSI模型分为七层: –由下到上分别为物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. 特点:1.OSI模型每层都有自己的功能集:2.层与层之间相互独立又相互依靠:3.上层依赖于下层,下层 ...

  9. javascript 函数声明和函数表达式

    定义js函数的方法有两种,1.函数声明 2.函数表达式 这两种方式的区别是:1.函数声明可以先调用后定义(javascript引擎在解释的时候会把所有的函数声明提升)2.函数表达式必须先定义后使用.看 ...

  10. 由Python的一个小例子想到的

    习题: L = [1,2] L.append(L) Print L 问,结果是什么. 结果是,[1,2,[...]] 这是什么意思呢?就是说[...]表示的对[1,2]的无限循环.这一点是在C#等静态 ...