wchar_t

抄书(标准C语言指南)

元气小坏坏 提交于 2020-01-01 22:47:28
2.2 字符 在传统的C语言里,字符(character)是指任意一个字节里的内容,是一个有特定含义的比特序列。由于这个比特序列至少需要用一个原子粒度的存储单元(也就是字节)来承载,所以,传统的C语言的"字符"是指单字节字符。 但是,随着C语言的国际化,一个大的问题显现出来:汉语、日语、韩语,甚至拉丁文化圈的文字一个字节不够,需要用多个字节来表示,这就引入了“多字节字符”和“宽字符”的概念。因此,如果从广义上来说,字符是信息的一个单位,文本数据由他们组成,通过他们,文本的内容得以展现和表示,同时他们又是对文本数据进行控制和处理的基本单位。 在这本书中,字符的含义取决于具体的上下文语境,有时指单字节字符,有时指多字节字符或者宽字符。 2.2.1 多字节字符 源字符集和执行字符集实际上都包括一个基本部分,或者说是一个子集,称为基本字符集。除此之外,他们还包括一些扩展字符。 扩展字符基本上都是各个国家和地区所使用的本地字符,因其数量庞大,一个字节无法表示,必须使用多个字节。 一旦决定对不同字符使用不同数量的字节,那么,源字符集和执行字符集中的成员都将需要一个或者多个字节表示。像这样,使用一个以上的字节来表示的字符被称为多字节字符。 典型的多字节字符是采用UTF-8编码方式表示的字符,他说Unicode和ISO/IEC 10646字符集的一种编码方式。 相对于传统的单字节符和宽字符

编写屏幕保护程序

限于喜欢 提交于 2019-12-31 03:04:09
参考网址: https://blog.csdn.net/xylary/article/details/1737627 https://www.windows-commandline.com/configure-screensaver-command-line/ https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-systemparametersinfow 一 编写屏幕保护程序 微软已经写了一个静态类库ScrnSav.lib, 只要包含头文件, 实现几个接口就可以做出一个屏保来, 相关代码如下: 注意: 屏幕保护程序实际是个exe, 但是使用的时候要把exe改成scr, 并且放在 windows\system32 或者windows\syswow64目录下 1 #include <Windows.h> 2 #include <ScrnSave.h> 3 4 #ifdef UNICODE 5 #pragma comment(lib, "ScrnSavw.lib") 6 #else 7 #pragma comment(lib, "ScrnSave.lib") 8 #endif 9 #pragma comment(lib,"comctl32.lib") 10 11 extern "C"

C++的一些笔记

泪湿孤枕 提交于 2019-12-27 16:53:46
1.尽量不要用include<iostream.h> 应该用include<iostream> 2.使用int main(void)格式 3.wchar_t 宽字节字符 2个字节 或者4个字节 4.size_t 在 C 语言中就有了。 它是一种 整型 类型,里面保存的是一个整数,就像 int, long 那样。这种整数用来记录一个大小(size)。size_t 的全称应该是 size type,就是说 一种用来记录大小的数据类型。 通常我们用 sizeof(XXX) 操作,这个操作所得到的结果就是 size_t 类型。 因为 size_t 类型的数据其实是保存了一个整数,所以它也可以做加减乘除,也可以转化为 int 并赋值给 int 类型的变量。 类似的还有 wchar_t, ptrdiff_t。 wchar_t 就是 wide char type, 一种用来记录一个宽字符的数据类型 。 ptrdiff_t 就是 pointer difference type, 一种用来记录两个指针之间的距离的数据类型 。 通常,size_t 和 ptrdiff_t 都是用 typedef 来实现的。 5.判断语句最好把右值写在前面 if (NULL == a) 因为有可能笔误写成if (NULL = a)这样就可以编译不通过提早发现问题 6.整数常量也可以带一个后缀,后缀是 U 和 L 的组合

【TCHAR、_T与_TEXT】【strcpy、wcscpy与_tcscpy】(转)

瘦欲@ 提交于 2019-12-15 04:57:47
https://blog.csdn.net/lu_chaoqun/article/details/19208105 (内容出自《把脉VC++》,挺好的一本书,下面内容是我整理摘录的两小节,顺便吐槽微软还真是整天把C搞的多复杂,让人找来找去) 4.5.3 TCHAR、_T与_TEXT 计算机最初使用的不是UNICODE,最初的系统和程序都采用的是ANSI或者MBCS,那么,问题来了:我们开发程序的时候,是采用char还是wchar_t?观察如下代码: char msg[] = "学习C++"; 当我们准备采用wchar_t时,则需要改成: wchar_t msg[] = L"学习C++"; 太麻烦了!幸运的是,Visual C++的开发者预知到了这样的麻烦,他们从而为此造出了一批宏,这些宏看起来乱七八糟的,但是确实解决了我们的问题,且看一段代码: TCHAR msg[] = _T("学习C++"); 这段代码中,msg到底是char数组还是wchar_t数组呢?Visual C++的解释是,如果需要它是char数组,那么它就是char数组;否则,它就是wchar_t数组。这样的魅力来源于宏TCHAR的定义: typedef unsigned char CHAR; typedef unsigned wchar_t WCHAR; #ifdef UNICODE typedef wchar

VS中字符集的Unicode和多字节字符集的区别

浪子不回头ぞ 提交于 2019-12-10 16:51:28
VS中字符集的Unicode和多字节字符集的用处,注意是 用处 所以不赘述具体编码方式。网上一大片。 ANSI编码(使用""包裹) Unicode编码(使用L""包裹) ---------------------------------------------------------------------------------------------------------------- 1 Winodows API有两种,一种W结尾,一种A结尾。 W结尾API,对应Unicode字符集。 A结尾API,对应ANSI多字节字符集。 1.VS新建工程,在主函数里随便输入个Win32API,例如“CreateProcess()” 2.设置字符集为多字节字符集 3.F12查看“CreateProcess()”函数定义,如下: #ifdef UNICODE #define CreateProcess CreateProcessW #else #define CreateProcess CreateProcessA #endif // !UNICODE //CreateProcessA会高亮,表示ANSI版本 //“CreateProcess()”所映射到的函数会根据所设置的字符集自动选择,当然,也可以手动选择使用哪个版本的函数。 4.设置为Unicode字符集

VC6中的MBCS和UNICODE编码

我的未来我决定 提交于 2019-12-07 00:10:40
【转】 今天写的一段代码涉及到MBCS编码和UNICODE编码的相互转换,查了一下MSDN的相关资料,整理如下: 在VC6中,默认使用MBCS编码,即多字节字符,实际就是支持大于0x80的ASCII码。这样,一个中文字可以表示为2个字节,GB2312就是这样表示的。 VC6的默认安装是不带UNICODE库的,要在VC6中写UNICODE程序,必须安装CRT和MFC的Unicode库。 要使你的程序支持Unicode,要在你的项目属性中去掉"_MBCS"宏定义,增加"UNICODE"和"_UNICODE"两个宏定义。(注意,这两个都应该加上,因为CRT和MFC使用UNICODE定义,而STL则使用_UNICODE) 如果你的程序是MFC的,则Unicode版MFC库的入口点是wWinMainCRTStartup。 为了方便开发者,VC6中提供了Tchar.h,里面定义了一些宏用来帮助写两种编码都兼容的代码。 类型 一般文本 数据类型名称 _UNICODE 和 _MBCS 未定义 _MBCS 已定义 _UNICODE 已定义 _TCHAR char char wchar_t _TINT int int wint_t _TSCHAR signed char signed char wchar_t _TUCHAR unsigned char unsigned char wchar_t

转载-wchar_t引发的思考

两盒软妹~` 提交于 2019-12-05 18:36:53
wchar_t引发的思考 - wen_dao_ - 博客园 http://www.cnblogs.com/wendao/archive/2012/07/27/2612597.html 字符集和字符编码(Charset & Encoding) - 吴秦 - 博客园 http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html#3300003 思考是由wchar_t引发的,干嘛要用wchar_t?我用char[]可以顺利的输出汉字啊! char是一个字节,wchar_t是2个字节或者4个字节的。 1.unicode字符集 一开始概念很混乱,发了几个帖子,和别人讨论了几天,自己理顺了下概念。我简单用我的话概括一下: unicode字符集,什么是字符集,字符集就是一个映射表计算机通过它找到对应的字符;unicode的把全球所有文字都做了映射。 utf-8、utf-16、utf-32都是编码方式,各自实现各自的方便。 utf-8来说利于传输因为它是变长的,有一个字节的(ascii在utf-8中都只占一个字节并且是一致的),俩的,三个的。 有一个传输出错不会影响其他的。如果是固定长度的多字节编码,少一个字节后面的往前补上,所有的字符编码都变了,都成乱码了。 另一个utf-8的好处是字符编码的每个字节都不会是0000h

Ansi与Unicode及慎用W2A等

允我心安 提交于 2019-12-04 20:54:47
Ansi与Unicode简要说明及各自的优缺点 他们是两种字符的编码格式,Ansi=窄字节,Unicode=宽字节,Ansi用char格式表示一个字符,占用一个字节的存储空间,最多表示255个字符, 表示英文还可以,但对于中文、日文、韩文等语言来说就不够用了,所以如果你的程序是Ansi编码的话, 那么你写的中文语言的程序拿到日文、韩文等系统上面就会出现乱码。所以有了Unicode,用二个字节去表示一个字符,格式是 unsigned short,被定义成 wchar_t 格式 这样就可以表示世界上绝大多数的语言了!但有利就有弊,缺点呢?就是空间占用翻倍了,网络传输的数据量也增大了…… ◆ vc++ 6.0 默认为Ansi编码,vs2005、vs2008、vs2010 等默认都是Unicode编码,当然可以进行工程的设置从而进行编码的转换,见演示! ◆ 就我个人观点:还是建议大家使用Unicode宽字节的编码格式,具体见下面: ◆ 系统提供了两种类型的 API 函数,见:user32.dll 中的 MessageBox 函数,其实 MessageBox 他只是一个宏,他对应的两个版本的函数分别为:MessageBoxA 和 MessageBoxW,你在使用的时候系统会根据是否定义了_UNICODE 宏来进行判断该使用哪个版本的函数!如果你的工程没有定义_UNICODE 宏

mbstowcs_s实现wchar_t转成char

て烟熏妆下的殇ゞ 提交于 2019-12-04 18:48:35
把 char* 转换为 wchar_t* 用 stdlib.h 中的 mbstowcs_s 函数,可以通过下面的例子了解其用法: char *CStr = "string to convert" ; size_t len = strlen(CStr) + 1; size_t converted = 0; wchar_t *WStr; WStr=( wchar_t *)malloc(len* sizeof ( wchar_t )); mbstowcs_s(&converted, WStr, len, CStr, _TRUNCATE); 其结果是 WStr 中储存了 CStr 的 wchar_t 版本。 把 wchar_t* 转换为 char* 和上面的方法类似,用 stdlib.h 中的 wcstombs_s 函数,例子: wchar_t *WStr = L "string to convert" ; size_t len = wcslen(WStr) + 1; size_t converted = 0; char *CStr; CStr=( char *)malloc(len* sizeof ( char )); wcstombs_s(&converted, CStr, len, WStr, _TRUNCATE); 这时 WStr 中的内容将被转化为 char 版本储存在 CStr

CString, BSTR, LPCTSTR 概念

纵饮孤独 提交于 2019-12-03 13:21:59
CString是一个动态TCHAR数组 , BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵 ) LPCTSTR只是一个常量的TCHAR指针。 CString 是一个完全独立的类,动态的TCHAR数组,封装了+等操作符和字符串操作方法。 typedef OLECHAR FAR* BSTR; typedef const char * LPCTSTR; vc++中各种字符串的表示法 首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。 LP的含义是长指针(long pointer)。LPSTR是一个指向以‘\0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。 1. LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的. 2. C表示const 3. T是TCHAR,在采用Unicode方式编译时是wchar_t,在普通时编译成char. 为了满足程序代码国际化的需要,业界推出了Unicode标准