实际上bstr很像delphi里面的string,平时只是指向pchar或pwchar,但是在pchar和pwchar的前面却有长度信息,以下是一段来自网络的解释: BSTR并不是WCHAR*,BSTR 存储的值是一个指向WCHAR数组的指针,但是在这个指针前面还有4个字节是指明这个字符串的长度。 所以,你可以将BSTR当作WCHAR*用,但是不能将WCHAR*当作BSTR用!
目录 前言 一、与字符集的关系 二、代码实例 三、常见宏 ---- 前言 众所周知,C++中的字符分成两种类型:wchar_t和char。 其中,WCHAR 对应 wchar_t,CHAR 对应 char,TCHAR 是一种条件编译的类型,根据条件动态代表 wchar_t 或者 char。 wchar_t表示一个Unicode字符。 std::string表示一个ANSI字符串。 std::wstring表示一个Unicode字符串。 三、常见宏 常见宏对应的具体的数据类型: LPSTR – char* LPWSTR – wchar_t* LPTSTR – char* 或 wchar_t* LPCSTR – const char* LPCWSTR – const wchar_t* LPCTSTR – const wchar_t* 或 const char* 作者简介:大家好,我是 Data-Mining(liuzhen007),是一位典型的音视频技术爱好者
关于wchar_t 在C++标准中,wchar_t是宽字符类型,每个wchar_t类型占2个字节,16位宽。汉字的表示就要用到wchar_t 。char,我们都知道,占一个字节,8位宽。 是大写 wcout<<str<<endl;//显示宽字符数组,下同 wprintf(str); system("pause"); wchar_t 转换为char 的代码如下: 有如下的wchar_t和char 变量 wchar_t w_cn = '中'; char c_cn[2] = {'0'} ; char *C2W(wchar_t w_cn , char c_cn[2]) { //following code 16位的wchar_t需要用两个8位的char来存储之。 用system("pause>nul") 就可以了 wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString
In C++, wchar_t is a distinct fundamental type (and thus it is not defined in <cwchar> nor any other 在C中,这是一个整数类型的typedef wchar_t 是C/C++的字符类型,一种扩展的存储方式,主要用在国际化程序的实现中。 比如对于汉字,韩文以及日文这样的字符,它们的每一个文字都占据两个字节,所以C++提出了wchar_t类型,也称为双字节类型,或宽字符类型。 //LC_ALL表示设置所有的选项(包括金融货币、小数点,时间日期格式、语言字符串的使用习惯等),chs表示中文简体 setlocale(LC_ALL, "chs"); wchar_t
参考链接: C++ putwchar() 宽字符wchar_t 与 窄字符char 先说下窄字符char,这个大部分读者应该很清楚,char类型的变量占一个字节(byte)(也就是8个bit(比特) 上述两种方法都可以用来确定char是无符号数还是有符号数(感兴趣的读者可以自行测试一下char的边界,如果char是有符号数,可以给char赋值127或128来看一下会出现什么结果) 现在来说下宽字符wchar_t ,先来看下char和wchar_t在存储空间上的差别 运行结果: 从上面可以看出char占一个字节,wchar_t占两个字节 下面来确定wchar_t是有符号数还是无符号数 运行结果: 从上面的结果可以看出wchar_t为无符号数,因为wchar_t占两个字节,也就是16个比特(bit),最大值就是216-1=65535,到这里读者可以看出宽字符和窄字符最大的区别就是占字节大小的不同 wchar_t也主要以这两种方式实现 ( c/c++标准只是声明wchar_t是一个足够宽的变量类型,可以表示字符集中的任意一个字符) Unicode 是一套字符集,而不是一套字符编码,严格来说
代码编译运行环境:Windows 64bits+VS2017+Debug+Win32 ---- 1.问题描述 char*表示的是多字节字符串,比如ASCII、GB2312、GBK等,wchar_t*表示的是宽字符串 ,即Unicode字符串,由于编码不同,所以在char*和wchar_t*之间无法使用强制类型转换。 2.char*与wchar_t*之间相互转换 要想将宽字符串转换成多字节编码字符串(或者反过来),必须先读懂原来的字符串,然后再重新对它进行编码。只有这样才能到达转换的目的。 利用标准库函数可以完成char*与wchar_t*之间的转换,关键函数有setlocale()、wcstombs_s()和mbstowcs_s()。 Linux同样提供的相关的系统调用来实现char*与wchar_t*之间的转换,char*到wchar_t*的转换使用mbstowcs(),反之使用wcstombs(),感兴趣的读者可自行实现。
;//基本类型:双浮点型(double)double pai = 3.14159;//基本类型:无类型(void),你看我的main方法叫void main,因为我什么也不返回//基本类型:宽字符型(wchar_t )wchar_t intw = 12;}(2).c++的基本数据类型竟然没有string,作为一名phper很不理解,原来是因为string可以用char来实现,因此并未成为基本数据类型,仅仅只是放在std wchar_t 类型其实是其他类型的别名,其实它的真正类型是short int 类型。 类型也是使用typedef起的别名,它的原型如下:typedef short int wchar_t;(4).在c++中数据类型还有类型修饰符,主要有以下几种:signed , unsigned , wchar_t2 或 4 个字节1 个宽字符
wchar_t是C/C++的字符类型,是一种扩展的存储方式。wchar_t类型主要用在国际化程序的实现中,但它不等同于unicode编码。unicode编码的字符一般以wchar_t类型存储。 在我们的SDK开发中,偶尔会用wchar_t*类型的参数。 , int x, int y); 那么在iOS如何将NSString字符串转成wchar_t*呢? 方法如下: +(const wchar_t*)stingTowWchar_t:(NSString*)string { return (wchar_t*)[string cStringUsingEncoding :NSUTF32StringEncoding]; } 如果需要将wchar_t*转成NSString字符串,方法如下: +(NSString*)getStringFromWChar:(const wchar_t
wprintf (const wchar_t*, ...); _CRTIMP int __cdecl swprintf (wchar_t*, const wchar_t*, ...); (wchar_t*, size_t, const wchar_t*, __VALIST); _CRTIMP int __cdecl fwscanf (FILE*, const wchar_t* wchar_t*, const wchar_t*, int); _CRTIMP wchar_t* __cdecl _wtmpnam (wchar_t*); _CRTIMP wchar_t * __cdecl _wtempnam (const wchar_t*, const wchar_t*); _CRTIMP int __cdecl _wrename (const wchar_t (const wchar_t*); _CRTIMP FILE* __cdecl _wpopen (const wchar_t*, const wchar_t*); #endif /*
char:8位字节类型,表示ASCII码 WCHAR:16位字符类型,表示Unicode字符 typedef wchar_t WCHAR; typedef unsigned short wchar_t ; (1)A2W的用法:char* ——> WCHAR* USES_CONVERSION; CString cstring; char* achar = "qwer"; const WCHAR * wchar = A2W(achar); cstring = wchar; (2)W2A的用法:WCHAR*——> char* USES_CONVERSION; CString cstring; WCHAR* wchar = _T("qwer"); const char* achar = W2A(wchar); cstring = wchar; (3)A2T的用法:char* ——> CString
总览函数声明函数功能 wchar_t *wcsdup(const wchar_t *str);用于复制宽字符字符串 int wcsicmp(const wchar_t *s1, const wchar_t , 并考虑当前本地环境的语言和排序规则 wchar_t *wcslwr(wchar_t *str);用于将宽字符字符串转换为小写字母形式 wchar_t *wcspbrk(const wchar_t * wchar_t *wcsrev(wchar_t *str);用于将宽字符字符串反转wchar_t *wcsset(wchar_t *str, wchar_t ch);用于将宽字符字符串中的所有字符设置为指定字符 wcstoull(const wchar_t* str, wchar_t** endptr, int base);用于将宽字符串转换为无符号长整型 wchar_t* wcsupr(wchar_t* str wchar_t* src, size_t n);用于将将源宽字符串的前 n 个字节的内容拷贝到目标字符串中 wchar_t* wmemmove(wchar_t* dest, const wchar_t
wchar_t; (双字节的无符号短整数) 下面是若干常用的宽字符函数(包含在ISO C99 / ISO C++的标准库中): #include <wchar.h> size_t wcslen( const wchar_t *s); int wprintf(const wchar_t * format, ...); int wscanf(const wchar_t * format, ... ); int swprintf(wchar_t * s, size_t n, const wchar_t * format, ...); int swscanf(const wchar_t * s, const wchar_t * format, ...); long int wcstol(const wchar_t * nptr, wchar_t ** endptr, int base); float wcstof(const wchar_t * nptr, wchar_t ** endptr); double wcstod(const wchar_t * nptr, wchar_t *
总览函数声明函数功能 wchar_t * wcscat(wchar_t *dest, const wchar_t *src);用于将一个宽字符字符串追加到另一个宽字符字符串的末尾 wchar_t *wcschr (const wchar_t *str, wchar_t wc);用于在宽字符串中查找指定字符的位置 int wcscmp(const wchar_t *str1, const wchar_t *str2 *str2);用于比较两个宽字符串的大小 wchar_t *wcscpy(wchar_t *dest, const wchar_t *src);用于将一个宽字符串复制到另一个字符串中 size_t wcsftime wcslen(const wchar_t *str);用于计算宽字符串的长度wchar_t *wcsncat(wchar_t *dest, const wchar_t *src, size_t n); *haystack, const wchar_t *needle);用于在一个宽字符串中查找另一个宽字符串size_t wcsspn(const wchar_t *str, const wchar_t
wchar_t被称为宽字符,一个wchar_t占2个字节。之所以叫宽字符是因为所有的字都要用两个字节(即一个wchar_t)来表示,不管是英文还是中文。 ; wchar_t wszChar3[2] = L"中";// 前两个字节(前一个wchar_t)存放汉字'中',最后两个字节(后一个wchar_t)存放字符串结束符\0 wcout << L"字符3: ) << endl; wchar_t wszChar3[2] = L"中";// 前两个字节(前一个wchar_t)存放汉字'中',最后两个字节(后一个wchar_t)存放字符串结束符// Test0601 ; wchar_t wszChar3[2] = L"中";// 前两个字节(前一个wchar_t)存放汉字'中',最后两个字节(后一个wchar_t)存放字符串结束符\0 wcout << L"字符3: char与wchar_t的区别 下面是常用的多字节和宽字节对照表。
总览函数声明函数功能 wchar_t *wcstok(wchar_t *wcs, const wchar_t *delim, wchar_t **ptr);用于将一个长字符串拆分成几个短字符串(标记), 并返回第一个标记的地址wchar_t *wcstok(wchar_t *wcs, const wchar_t *delim);用于将一个长字符串拆分成几个短字符串(标记),并返回第一个标记的地址long wmemcmp(const wchar_t* s1, const wchar_t* s2, size_t n);用于比较两个宽字符数组的前 n 个宽字符 wchar_t* wmemcpy(wchar_t * dest, const wchar_t* src, size_t n);用于将一个宽字符数组的前 n 个宽字符复制到另一个宽字符数组wchar_t* wmemset(wchar_t* s, wchar_t , wchar_t **ptr);用于将一个长字符串拆分成几个短字符串(标记),并返回第一个标记的地址wchar_t *wcstok(wchar_t *wcs, const wchar_t *delim
double __cdecl _wcstod_l(__in_z const wchar_t *_Str, __deref_opt_out_z wchar_t ** _EndPtr, __in_opt wchar_t ** _EndPtr, int _Radix);_CRTIMP __checkReturn long __cdecl _wcstol_l(__in_z const wchar_t , __in_z_opt const wchar_t *, _Dir, __in_z_opt const wchar_t *, _Filename, __in_z_opt const wchar_t * wchar_t * _Filename, __in_z const wchar_t * _EnvVar, __out_ecount_z(_SizeInWords) wchar_t * _ResultPath __cdecl _wsplitpath(__in_z const wchar_t * _FullPath, __out_z_opt wchar_t * _Drive, __out_z_opt wchar_t
MultiByteToWideChar; 2.使用mbstowcs_s和wcstombs_s(vs中添加_s); 3.使用c++11提供的wstring_convert<std::codecvt_utf8<wchar_t 需要头文件#include “locale.h” string curLocale = setlocale(LC_ALL, NULL); setlocale(LC_ALL, “chs”); const wchar_t * _Dest = new wchar_t[_Dsize]; wmemset(_Dest, 0, _Dsize); size_t len = 0; mbstowcs_s(&len, _Dest, _Dsize ; } int main() { //string wstring 间转换 string s = “12345”; wstring ws = s2ws(s); wchar_t buf[20] = { [] s3; s3 = NULL; const char* s4 = "abcde"; const wchar_t* ws4 = ctowc(s4); wprintf(L"test2 ctowc:%ws
Output窗口的有效全部代码,故而自己写出来直接用 TraceOutput 和 TraceOutputW 即可 这是输出两参数的 #include <Windows.h> static wchar_t * CastToWideChar(const char* pszMultiByte) { int iSize; wchar_t* pwszUnicode; iSize = MultiByteToWideChar(CP_ACP, 0, pszMultiByte, -1, NULL, 0); pwszUnicode = (wchar_t *)malloc(iSize * sizeof(wchar_t)); MultiByteToWideChar(CP_ACP, 0, pszMultiByte, -1, pwszUnicode = wcslen(parameter); int length = length1 + length2 + 1; wchar_t *buffer = new wchar_t
// static int GetRequiredMultiByteLengthForUnicodeString(wchar_t* szUnicodeString, int nCodePage = (_TCHAR)); Read(&cDummy, sizeof(wchar_t)); } // If compiled for Unicode #ifdef _UNICODE if [nMAX_LINE_CHARS]; // Initialise to something safe memset(pszUnicodeString, 0, sizeof(wchar_t) m_pStream || GetPosition() == 0) { wchar_t cBOM = (wchar_t)nUNICODE_BOM; CFile::Write(&cBOM , sizeof(wchar_t)); } } // If compiled in Unicode...
参考链接: C++ wcstok() wcsstr函数原型:wchar_t *wcsstr( const wchar_t *string, const wchar_t *strCharSet ); 函数功能 wcscat函数原型:wchar_t *wcscat(wchar_t *strDestination, const wchar_t *strSource); 函数功能:把strSource所指字符串添加到 wcschr函数原型:wchar_t *wcschr(wchar_t *_Str, wchar_t _Ch); 函数重载1:const wchar_t *wcschr(const wchar_t *_Str * wcspbrk(wchar_t *_Str, const wchar_t *_Control); 函数重载1:const wchar_t * wcspbrk(const wchar_t *_Str ,如果没有匹配字符则返回空指针NULL wcsrchr 函数原型:wchar_t * wcsrchr(wchar_t *_Str, wchar_t *_Ch); 函数重载1:const wchar_t