c++ wchar_t
·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 #define _T(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的更多相关文章
- 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版本的代码,但 ...
- wchar_t内置还是别名?小问题一则(升级公司以前代码遇到的问题)
问题: 原来的2008工程用2010编译后,运行程序出现无法定位程序输入点 *@basic_string@_WU@*和*@basic_string@G@* 解决: 关闭“语言选项”中“将WChar_t ...
- 彻底搞定char/wchar_t/unicode
彻底搞定char/wchar_t!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (2013-07-17 10:18:28) 转载▼ 从char/wchar_t到TCHAR(1) ...
- char、wchar_t、strlen、wcslen
第一部分: strlen函数的宽字符版是wcslen(wide-character string length:宽字符串长度),并且在STRING.H(其中也说明了strlen)和WCHAR.H中均有 ...
- char 转wchar_t 及wchar_t转char
利用WideCharToMultiByte函数来转换,该函数映射一个unicode字符串到一个多字节字符串.通常适合于window平台上使用. #include <tchar.h> #in ...
- char*,wchar_t*,CString和BSTR之间的转换
前言 本文并不尝试列举出所有的转换方法,只列举作者认为方便易用的方法. 1.char*和wchar_t*的相互转换 可以利用中间类_bstr_t(头文件comdef.h)方便的进行相互转换 const ...
- c++中char*\wchar_t*\string\wstring之间的相互转换
string U2A(const wstring& str)//Unicode字符转Ascii字符 { string strDes; if ( str.empty() ) goto __end ...
- Unichar, char, wchar_t
之前总结了一些关于字符表示,以及字符串的知识. 现在在看看一些关于编译器支持的知识. L"" Prefix 几乎所有的编译器都支持L“” prefix,一个字符串如果带有L“”pr ...
- char,wchar_t,WCHAR,TCHAR,ACHAR的区别----LPCTSTR
转自http://blog.chinaunix.net/uid-7608308-id-2048125.html 简介:这是DWORD及LPCTSTR类型的了解的详细页面,介绍了和类,有关的知识,加入收 ...
- Error LNK2019: unresolved external symbol "char * __stdcall _com_util::ConvertBSTRToString(wchar_t *)"
Error 2 error LNK2019: unresolved external symbol "char * __stdcall _com_util::ConvertBSTRToStr ...
随机推荐
- struts 类型转换器
类型转换 (来自尚学堂) a) 默认转换 i. 日期处理 b) 写自己的转换器: public class MyPointConverter extends Defau ...
- 【小程序】微信小程序开发—弹出框
1. <span style="font-family:Comic Sans MS;font-size:18px;color:#333333;"><view cl ...
- bootstrap学习笔记 插件概述
Bootstrap插件概览 在前面布局组件章节中所讨论的组件仅仅是个开始.Bootstrap自带的12种jQuery插件,扩展了功能,可以给站点添加更多的互动.即使您不是一名高级的js开发人员, 你也 ...
- Windows Visual Studio 下配置OpenGL
很多同学不是很清楚OpenGL的配置,一个个帮忙配置也不是办法,干脆就写一篇教程好了. 本人使用的是Visual Studio 2015版本,对于Visual Studio 2012版本的配置会稍有不 ...
- python selenium --browser 操作
本节知识点: 打印URL 将浏览器最大化 设置浏览器固定宽.高 操控浏览器前进.后退 打印URL 上一节讲到,可以将浏览器的title打印出来,这里再讲个简单的,把当前URL打印出来.其实也没啥大用, ...
- object-c输出对象
有时候在xcode里打断点很不准,看到对象总是nil,还是用打log比较靠谱: NSLog(@"obj info:%@",obj);
- uva 10808 - Rational Resistors(基尔霍夫定律+高斯消元)
题目链接:uva 10808 - Rational Resistors 题目大意:给出一个博阿含n个节点,m条导线的电阻网络,求节点a和b之间的等效电阻. 解题思路:基尔霍夫定律,不论什么一点的电流向 ...
- Sublime Text 2 入门与总结
Sublime Text 2 入门与总结 首语 : 考完试,但又没什么兴趣做课程设计,蛋疼的弄点软件入门的介绍,希望给各位还在吃香蕉的程序猿带来一点启示... 代码编辑器,就像武侠中的武 ...
- [华为机试练习题]5.IP地址推断有效性
题目 推断输入的字符串是不是一个有效的IP地址 具体描写叙述: 请实现例如以下接口 boolisIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符 ...
- flink checkpoint 源码分析 (二)
转发请注明原创地址http://www.cnblogs.com/dongxiao-yang/p/8260370.html flink checkpoint 源码分析 (一)一文主要讲述了在JobMan ...