·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. 强大的代码生成工具 MyGeneration

    MyGeneration是一个功能很强大的代码生成工具.通过编写包含各种类型脚本(C#,VB.Net,JScript,VBScript)的模板,通过数据库的表内容,生成你需要的各种代码.你可以用它来生 ...

  2. django inspectdb

    使用inspectdb  --通过已有数据库表生成 model.pyinspectdb辅助工具检查你的settings文件指向的数据库,决定你表示你的表的Django模型并打印Python模型代码到标 ...

  3. socket.io(转载)

    socket.io 中文手册,socket.io 中文文档转载于:http://www.cnblogs.com/xiezhengcai/p/3956401.html 服务端 io.on(‘connec ...

  4. 如何在mysql下实现事务的提交与回滚

    最近要对数据库的数据进行一个定时迁移,为了防止在执行过程sql语句因为某些原因报错而导致数据转移混乱,因此要对我们的脚本加以事务进行控制. 首先我们建一张tran_test表 CREATE TABLE ...

  5. Excel 출력

    NativeExcel 참조 사이트 http://www.nika-soft.com/dwnld.htm IWorkbook book = Factory.CreateWorkbook(); lWo ...

  6. centos7和scientific linux7里面调出中文输入法

    默认安装后,却没有中文输入,于是研究以下,原来是没有调出来. 1.应用程序->系统工具->设置 2.选择“区域和语言” 3.这里默认会有一个汉语,如果没有,那么你当初选择安装的是英语,需要 ...

  7. python访问纯真IP数据库的代码

    通过IP地址判断客户端是网通的还是电信的. 使用一个纯文本的IP纯真数据库,用Python写了一个小程序. 核心代码: #!/usr/bin/env python #site www.jbxue.co ...

  8. atitit.session的原理以及设计 java php实现的异同

    atitit.session的原理以及设计 java php实现的异同 1. session的保存:java在内存中,php脚本因为不能常驻内存,所以在文件中 1 2. php的session机制 1 ...

  9. C# 版 防止 DNS 污染,获取域名真实 IP 地址

    using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Net. ...

  10. 获取表单select域的选择部分的文本

    body> <form action="index.php"> <select name="" id="select" ...