·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. python内置函数、匿名函数、递归

    python3--内置函数 内置函数: 截止到python 3.6.2 版本,现在python一共提供了68个内置函数:即python提供给你直接可以拿来使用的所有函数.   内置函数  (点击函数查 ...

  2. Python: 去掉字符串中的非数字(或非字母)字符

    >>> crazystring = ‘dade142.;!0142f[.,]ad’ 只保留数字>>> filter(str.isdigit, crazystring ...

  3. jQuery 树型菜单插件(Treeview)

    jQuery Treeview 提供了一个无序灵活的可折叠的树形菜单.试用于一些菜单的导航,支持基于 cookie 的持久性菜单

  4. python导入模块的两种方式

    第一种 from support import * 这种方式导入后可以直接调用(有命名冲突问题)命名冲突后定义的覆盖前定义的 如果在函数导入前定义 则导入函数覆盖 否则相反 if __name__ = ...

  5. MQTT 学习笔记

    MQTT特点 MQTT协议是为大量计算能力有限,且工作在低带宽.不可靠的网络的远程传感器和控制设备通讯而设计的协议. 1.使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合 2.对负载内容 ...

  6. springMVC中实现用户登录权限验证

    通过上网搜资料显示,使用filter和interceptor都可以实现.不过推荐使用interceptor. 下面就使用Interceptor实现用户登录权限验证功能. 拦截器需要实现Inceptor ...

  7. [转]Windows 10 安装SVN 不显示状态图标--解决方法

    原文链接:https://www.cnblogs.com/lzpong/p/6187366.html --- auth:lzpong 升级win10以后,什么都正常,就是svn版本库图标不见了,图标的 ...

  8. 如何使用ip端口来浏览自己的网站

    现在做网站的朋友越来越多,域名注册后往往需要进行备案,而在备案期间我们的域名又不能正常打开,在服务器上直接编辑浏览我们的网站有些棘手,思来想去,在我们购买的服务器ip后面加上个端口来达到域名一样的效果 ...

  9. dbutils使用---QueryRunner、BeanListHandler、BeanHandler、MapListHandler、MapHandler、ScalarHandler

    1. ResultSetHandler 的作用: QueryRunner 的 query 方法的返回值最终取决于 query 方法的 ResultHandler 参数的 hanlde 方法的返回值. ...

  10. 做过的自定义 View

    做过的自定义 View android view custom 音频条状图 需求 详细设计 具体实现 音频条状图 需求 音频图 最终效果类似于音频图中的条状图 只是效果模拟,并不监听真实的音频 条的宽 ...