wchar_t

VC++2005 CString和char*的相互转换

我是研究僧i 提交于 2020-01-29 05:06:43
首先声明我不是一个高手,而是一个初学者,文章同样也是一个初学者对于CString和char*转换的理解。 因为需要,接触C++一段时间了,其中最为困扰我的问题就是在使用C++的过程中CString和char*的转换,在网上搜索了一下,看到问这个问题的人挺多的。我使用的平台是Win2003+VC 2005,本来这个很简单的问题稍微复杂了一点在2005里面。 在我的工程里面要集成一个用C开发的程序,用VC做windows窗体的界面,在C的函数中有不少是使用char*作为参数的,因此有一个必不可少的步骤就是把CString转换为shar*字符串。 作为一个初学者,遇到这个问题,首先是在baidu上搜索了一下转换的方法,有很多结果,别人也说有效,但是我把它放在我的代码里面的时候,就是出现错误。下面是我的解决办法。 使用CString的GetBuffer方法 CString origCString("Hello,World"); char* CharString = origCString.GetBuffer(origCString.GetLength()+1); 网上的很多文章说的都是这个方法,但是我在VC++2005中编译得到下列信息 Error 1 error C2440: 'initializing' : cannot convert from 'wchar_t *' to

C++设计模式——模板方法模式

人走茶凉 提交于 2020-01-27 06:51:53
模板方法模式 在GOF的《设计模式:可复用面向对象软件的基础》一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的接口即可重定义改算法的某些特定步骤。 我结合我在实际开发项目中的一个例子来说说这个模板方法模式吧。我们曾经做过一款产品,这个产品类似于一个云端的文件管理客户端。对于这样的一个客户端,由于其云端的服务器有三种,而每一种服务器之间的通信方式和对外公开的接口都是不是一致的,这就需要实现的客户端要屏蔽云端服务器和接口的差异性,而提供统一的操作界面,所以在实现这个客户端的同时,我们实现了一个框架,一个对于服务器和接口是通用的框架,比如就拿文件下载来说说。我们的实现大概如下: class FileOperation { public: bool DownloadFile(wchar_t *pSrc, wchar_t *pDest) { if (!pSrc || !pDest) return false; if (!DoBeginDownloadFile(pSrc, pDest)) return false; if (!DoDownloadFile(pSrc, pDest)) return false; if (!DoEndDownloadFile(pSrc, pDest)) return

UNICODE与ANSI的区别

回眸只為那壹抹淺笑 提交于 2020-01-26 21:29:03
#include <iostream> #include <Windows.h> using namespace std; int main() { wchar_t * first= L"h"; wcout<<*first; getchar(); return 0; } 结果输出h 并区别以下代码: #include <iostream> #include <Windows.h> using namespace std; int main() { wchar_t * first= L"h"; cout<<*first;//非wcout getchar(); return 0; } 输出104 vc6,到vs2012.对字符的编码上多了好些转换的要求。 其它 是UNICODE与ANSI的区别。 UNICODE容器与ANSI容器大小不一,所以要转换。 电脑不是人类,底层只会区分0,1。 没有正确的转换,就显示出不同的解释,情况乐观的话,编译就通不过。 Unicode与Ansi的历史在百度上都可以找到 1,用单个中文来找比方,Ansi要用两个来拼(解码麻烦),Unicode里直接有对应的 2,C语言使用'/0'作为字符串结尾,而Unicode有很多字符都有一个字节为0,这样一来,C语言的字符串函数将无法正常处理Unicode 3,系统问题

wxWidgets随笔(6)-utf8中文(2)

自作多情 提交于 2020-01-21 04:32:43
当使用Microsoft Visual c++时不能编译,需要更改为使用mb_str()(这对于包含Unicode字符的文件名无效,请考虑使用wxWidgets类和函数来处理这些文件名,因为标准c++库不支持它们)。 另一类不兼容的更改是由于修改了一些虚方法来使用wxString参数而不是const wxChar 参数,从而使它们同时接受窄字符串和宽字符串。这不是一个问题,如果你只是调用这些函数,但你需要改变签名的派生类版本,如果你覆盖他们,否则他们不会被调用了。再次强调,确保这个问题不出现的最佳方法是使用警告函数签名不匹配的编译器重新构建代码(可以使用-Woverloaded-virtual g++选项)。 最后,一些结构字段,如著名的wxCmdLineEntryDesc::shortName、longName和description字段已被更改为const char 类型,而不是const wxChar*类型,因此,如果将wxT()或_T()与它们的初始化器一起使用,则需要删除它们。 Unicode是什么? Unicode是一种字符编码标准,它解决了以前标准(如ASCII标准)的缺点,使用8位、16位或32位对每个字符进行编码。这使得有足够的代码点(参见下面的定义)一次性编码所有世界语言。更多关于Unicode的细节可以在http://www.unicode.org/找到。

size_t

六眼飞鱼酱① 提交于 2020-01-20 08:48:03
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来实现的。你可能在某个头文件里面找到类似的语句: typedef unsigned int size_t; 而wchar_t则稍有不同。在一些旧的编译器中,wchar_t也可能是用typedef来实现,但是新的标准中wchar_t已经是C/C++语言的关键字,wchar_t类型的地位已经和char, int的地位等同了。 在标准C/C++的语法中,只有int float char bool等基本的数据类型,至于size_t,或size

size_t类型

霸气de小男生 提交于 2020-01-20 00:33:51
size_t和ssize_t是ANSI C提供的标准头文件里定义的一个“数据类型”,其实并不是新的数据类型,不是关键字,是通过typedef从已有数据类型定义而来。 ANSI C总共提供了24个头文件,他们所处的目录因编译器而异,作者用的编译器是gcc4.3.2,大部分头文件在/usr/include目录下,但是定义size_t和ssize_t的头文件stddef.h则位于/usr/lib/gcc/i486-linux-gnu/4.3.2/include目录下,是这样定义的: #define __SIZE_TYPE long unsigned int ........................ typedef __SIZE_TYPE__ size_t; ......................... 即size_t实际上是无符号长整型,在32位系统上位32位,在64位系统中位64位。 size_t在C语言中就有了。 它是一种“整型”类型,里面保存的是一个整数,就像int, long那样。这种整数用来记录一个大小(size)。size_t的全称应该是size type,就是说“一种用来记录大小的数据类型”。 通常我们用sizeof(XXX)操作,这个操作所得到的结果就是size_t类型。 因为size_t类型的数据其实是保存了一个整数,所以它也可以做加减乘除

Windows SDK编程 API入门系列(转)

与世无争的帅哥 提交于 2020-01-10 08:00:28
本文转载自: https://www.cnblogs.com/yjkai/archive/2011/11/11/2245568.html 作者:yjkai 转载请注明该声明。 之一 -那‘烦人’的Windows数据类型 原创文章,转载请注明作者及出处。 首发 http://blog.csdn.net/beyondcode http://www.cnblogs.com/beyond-code/ http://hi.baidu.com/beyondcode Baidu文章地址: http://hi.baidu.com/beyondcode/blog/item/09370f24526d6b6835a80f54.html CSDN文章地址: http://blog.csdn.net/beyondcode/archive/2009/03/23/4015769.aspx Hello Everybody This is beyondcode 大家好 再次自我介绍一下 我是beyondcode, 这次心血来潮, 计划着做一系列关于Windows API 编程的教程,用于帮助一些在Windows API编程上有疑惑的,纳闷的,迷惑的新手朋友们。 先解释一些术语或名词吧 SDK是Software Development Kit的简写,也就是软件开发包的意思,其中就包含了我们写程序要用到的一些头文件,库

C++: VC6转VC8出现问题:error C2664: “fopen”: 不能将参数 1 从“CString”转换为“const char *”

别来无恙 提交于 2020-01-09 18:15:27
其实还可能出现其它类似的问题,如: error C2664: “fopen”: 不能将参数 1 从“CString”转换为“const char *” error C2039: “strcpy”: 不是“ATL::CStringT<BaseType,StringTraits>”的成员 但是程序在VC6下编译得很好,经过研究发现是设置上有所不同。在VC6中,默认使用MBCS编码,即多字节字符;而VC8、VC7默认的是Unicode编码,所以... 关于这两种编码有何不同,我引用了网上的一篇文章,由于作者匿名,只能在此感谢: http://pc.nengbang.cn/group_thread/view/id-2603 在VC6中,默认 使用 MBCS编码,即多字节字符,实际就是支持大于0x80的ASCII码。这样, 一个 中文字可以表示为2个字节,GB2312就是这样表示的。 VC6的默认 安装 是不带UNICODE库的,要在VC6中写UNICODE程序,必须 安装 CRT和MFC的Unicode库。 要使你的程序支持Unicode,要在你的项目属性中去掉"_MBCS"宏定义,增加"UNICODE"和"_UNICODE"两个宏定义。(注意,这两个都应该加上,因为CRT和MFC 使用 UNICODE定义,而STL则使用_UNICODE) 如果你的程序是MFC的

从VC6.0平台级到VS2008平台

余生颓废 提交于 2020-01-09 07:31:18
从VC6.0平台级到VS2008平台 最近在在把一些程序从VC6迁移到VS2008,由此而关注到一些这方面的知识,找了一些资料,根据自己遇到的一些情况,结合在一起,整理出来这篇文章,希望对以后有这方面工作的人多一些参考,如果大家还有可很享的可以跟贴。。。。 1、关于 #define WINVER 提到这个问题是因为,这里涉及到Winodws版本的定义。关于版本定义的关键无外乎为程序头文件中对于#define WINVER 和 #define _WIN32_WINNT 的使用,具体为: #define WINVER 0xXXXX #define _WIN32_WINNT 0xXXXX 该定义一般用于标示程序对运行环境的要求,另外在某些头文件中也有这样的宏定义。如果版本匹配的话就会在编译的时候将这些内容编译,否则就不编译。 定义正确的Windows版本,不仅关系到程序的正确编译,同时也关系到程序的正确运行;在升级的过程中,我就碰到了程序编译正确但运行出错的问题。 版本的定义关系到被编译到程序中的内容,这里主要是指系统提供的功能代码。Windows各个版本的功能虽然大差不差,但特定于某个系统功能还是存在的,于是关系到这些功能的API代码也就有所不一样。当我们在程序中定义了错误的系统版本,被编译进程序的内容便可能包含当前系统不支持的代码片段,这样的程序即使可能正确编译通过,但在运行的时候

string转LPCSTR\LPCWSTR示例

こ雲淡風輕ζ 提交于 2020-01-02 09:43:42
1、string类型转 LPCSTR string str="abcd"; LPCSTR str1=str.c_str(); 2、string类型转 LPCWSTR 自定义函数 str2LPCWSTR 方法一 LPCWSTR stringtoLPCWSTR(string str){ size_t strsize = str.length() + 1; const size_t newsize = 100; size_t convertedChars = 0; wchar_t* wcstring = (wchar_t*)malloc(sizeof(wchar_t) * (str.length() - 1)); mbstowcs_s(&convertedChars, wcstring, strsize, orig.c_str(), _TRUNCATE); return wcstring; } 例子: string str="abcd"; LPCWSTR str1=str2LPCWSTR(str); 方法二 LPCWSTR str2LPCWSTR( string str) { int len = str.length(); int lenbf = MultiByteToWideChar(CP_ACP, 0, str.c_str(), len, 0, 0); wchar_t* buffer