VC 中 字符串编程

/*

#ifdef WIDECHAR//#ifdef  /#ifndef 具有在本文件内向上溯源性  在上面的可以识别  在下面的不能识别

#endif

wchar_t *pszText=L"HelloT_char";

wprintf(L"%s\n",pszText);

#else

char *pszText="HelloT_char";

printf("单%s\n",pszText);

#endif

*/

对于wchar_t 类型的字符串 要进行c语言字符串相应的操作 都要加上w

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

1.ANSIC与Unicode字符

两者区别就不多少了,一个单字节一个双字节,Unicode可以表示更多的字符,适合诸如汉字的文字系统.

定义使用宽字符:

2.声明Unicode字符与及字符串方法:

_T()宏需要包含tchar.h

1     wchar_t c=L‘A‘;  
2     wchar_t szBuffer[10]=L"A String";3

WinNt.h定义了一下宏:

  #ifdef UNICODE 
    typedef WCHAR TCHAR ,*PTCHAR,PTSTR;
    typedef CONST WCHAR *PCTSTR;
     __TEXT(quote) quote
     __TEXT(quote) L##quote
 
    
    typedef CHAR TCHAR ,*PTCHAR,PTSTR;
    typedef CONST CHAR *PCTSTR;
     __TEXT(quote) quote
 
    
     __TEXT(quote) quote  TEXT(quote)

可以利用以上宏来定义:在Visual Studio新建工程,一般都开启了Unicode选项,直接就可以定义宽字符。

1 TCHAR C=TXET(‘a‘);//如果定义了Unicode 则是16位字符,否则是8位2     TCHAR C=L‘a‘;3     TCHAR szBuffer[10]=TEXT("a String");4     TCHAR szBuffer[10]=_T("a String");5

3.Ansic与Unicode的转换:

       *c =;
     std::cout<<c<<std::endl;
           Length = MultiByteToWideChar(CP_ACP,,c,-,NULL,);
     wchar_t *pWideCharStr =  wchar_t[(wchar_t)*Length];
     MultiByteToWideChar(CP_ACP,,c,,pWideCharStr,Length*(wchar_t));
     std::wcout<<<<pWideCharStr<<std::endl;
          Length = WideCharToMultiByte(CP_ACP,,pWideCharStr,-,NULL,,NULL,NULL);
      *pMultiByte =  [Length*()] ;
     WideCharToMultiByte(CP_ACP,,pWideCharStr,-,pMultiByte,Length*(),NULL,NULL);
     std::cout<<<<pMultiByte;
 
     delete [] pWideCharStr;
     delete [] pMultiByte;

补充:

size_t wcstombs ( char * mbstr, const wchar_t * wcstr, size_t max );//Convert wide-character string to multibyte string

size_t mbstowcs ( wchar_t * wcstr, const char * mbstr, size_t max );//Convert multibyte string to wide-character string

      这两个看就清楚怎么用了就不写了 比上面方法要简单

4.推荐的字符串使用方式

1).开始将文本字符串想像为字符的数组,而不是char或字节的数组
2).用通用的数据类型如用TCHAR PTSTR表示字符和字符串
3).统一用TEXT _T宏来表示字面量的字符和字符串,不要混用
4).用BYTE和 PBYTE来表示字节、字节指针和数据缓冲区
5).避免使用printf系列函数,尤其不要使用%s来进行Ansic跟Unicode的互相转换
      应该使用MultiByteToWideChar和WideCharToMutiByte,具体用法参看MSDN

6).推荐从现在开始就使用Unicode字符,理由很简单,为了程序代码的重用性:Com编程模型只支持Unicode

微软.Net技术,还有新的API函数都不支持ANSIC

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

char跟CString转换、string跟char转换、string 跟CString转换 还有BSTR转换成char*、char*转换成BSTR、CString转换成BSTR、BSTR转换成CString的

我们经常写程序比如文件路径需要用到一般都是char*类型的变量作为参数传递,有些函数参数却是string或者CString,造成了经常需要转换,在这里我总结了一下:

char跟CString转换:

代码

 CString cstr(_T());
wchar_t* wchar = cstr.GetBuffer();
* c1 =  [cstr.GetLength()+]; cstr.ReleaseBuffer();
wcstombs(c1,wchar,cstr.GetLength()+);
std::cout<<c1<<std::endl; 
delete c1;
    
CString theString(  );
LPTSTR lpsz =  TCHAR[theString.GetLength()+];
_tcscpy(lpsz, theString);
* c2 =  [theString.GetLength()+]; wcstombs(c2,lpsz,theString.GetLength()+);
std::cout<<c2<<std::endl;
delete c2;
    
* p2 = ;
wchar_t *p1 =  wchar_t[]; 
mbstowcs(p1,p2,);
std::wcout<<p1<<std::endl;
CString cstr1;
cstr1.Format(_T(),p1);
::MessageBox(NULL,cstr1,NULL,);
delete p1;

注意:

CString 是微软提供的数据类型,其中GetBuffer()函数是重载了ANSIC跟UNICODE的,假如编译器设置开启了Unicode

那它返回的就是宽字符类型,所以就需要wcstombs函数来转换。比如VC6下默认不支持Unicode,所以用它返回就不需要转换

string跟char转换:

代码

 s1();
* c3 =  [s1.size()+];
strcpy(c3,s1.c_str());    std::cout<<c3<<std::endl;  
delete c3;

* c4 = ;
 s2(c4);
std::cout<<s2<<std::endl;

注意:

string是标准库的数据类型,其成员函数c_str()返回的是ANSIC数据类型,所以不需要转换直接就为char,假如需要宽字符,再用mbstowcs就可以了

string 跟CString转换:

代码

CString cstr2;
 s3 = ;
* c5 =  [s3.size()+];
wchar_t* c6 =  wchar_t[s3.size()+];
strcpy(c5,s3.c_str());
mbstowcs(c6,c5,s3.size()+);
cstr2.Format(_T(),c6);  ::MessageBox(NULL,cstr2,NULL,);
delete c5;
delete c6;

CString cs1();
* c7 =  [cs1.GetLength()+];
wcstombs(c7,cs1.GetBuffer(),cs1.GetLength()+);
 s(c7);
std::cout<<s<<std::endl;
delete c7;

注意:

由上面两个就可以清楚知道:CString会根据环境重载ANSIC还是UNICODE版本的,而string只能是ANSIC版本的

而string跟CString转换原理是通过都转换为传统的char类型,然后再转换到对方,因此这里有需要进行ANSIC跟UICODE的转换

比如string接受传统的string s(char* ); 但CString.GetBuffer()返回有可能是wchar_t*类型的

BSTR转换成char*、char*转换成BSTR、CString转换成BSTR、BSTR转换成CString

(BSTR是COM里面经常会用到的数据类型,可能大家用得较少,我也没逐一进行认真分析了)

BSTR与char*转换:

代码

#include  comment(lib, "comsupp.lib")
 _tmain( argc, _TCHAR* argv[])
{
BSTR bstrText = ::SysAllocString(L);
* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
SysFreeString(bstrText); delete[] lpszText2;
 ;
}
_bstr_t b = bstrText;
* lpszText2 = b;

BSTR bstrText = ::SysAllocString(L);
BSTR bstrText = ::SysAllocStringLen(L,);
BSTR bstrText = ::SysAllocStringByteLen(,);
_variant_t strVar();
BSTR bstrText = strVar.bstrVal;
BSTR bstrText = _bstr_t(); 方法四,使用CComBSTR。例如:
BSTR bstrText = CComBSTR();
CComBSTR bstr();
BSTR bstrText = bstr.m_str;
方法五,使用ConvertStringToBSTR。
例如:
* lpszText = ;
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);

CString与BSTR转换:

代码

CString str();
BSTR bstrText = str.AllocSysString();
…
SysFreeString(bstrText); BSTR bstrText = ::SysAllocString(L);
CStringA str;
str.Empty();
str = bstrText; 或
CStringA str(bstrText);

时间: 2024-08-26 18:36:51

VC 中 字符串编程的相关文章

[VC]vc中socket编程步骤

sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW): 基于TCP的socket编程是采用的流式套接字.在这个程序中,将两个工程添加到一个工作区.要链接一个ws2_32.lib的库文件.服务器端编程的步骤:1:加载套接字库,创建套接字(WSAStartup()/socket()):2:绑定套接字到一个IP地址和一个端口上(bind()):3:将套接字设置为监听模式等待连接请求(listen()):4:请求到

VC中含中英文的\u格式UNICODE字符串转UNICODE可见字符串

JAVA使用UTF-8格式字符串,JAVA与C++通信时将UTF-8串转为UNICODE串,如“ABCDabcd中国人民下沙123.杭州”转为UNICODE后外观如下: \u41\u42\u43\u44\u61\u62\u63\u64\u4e2d\u56fd\u4eba\u6c11\u4e0b\u6c99\u31\u32\u33\u2e\u676d\u5dde VC中如下处理即可转回来 CString CXXClass::UnicodeToString() { CString strUnicod

【thrift】vc中使用thrift中文字符串乱码问题解决

问题描述: VC中使用Apache thrift时,如果字符串中包含中文,会出现乱码问题,这个问题的原因是由于thrift为了达到跨语言交互而使用了UTF-8格式发送字符串,这点对java或者C#不会造成影响,但是在VC中UTF-8却很成问题.VC中的string编码随项目编码一般是multibytes或者unicode,虽然倡导使用unicode,但实际上使用multibytes多字节开发仍然广泛存在,下面的解决方案主要解决的是多字节下的乱码问题. 解决方案 1.手动转换 第一种解决方案就是在

VC++中开发汇编语言(转)

汇编程序结构 一个显示字符串的汇编程序 程序格式 一.模式定义 二.includelib语句 三.函数声明语句 四.数据和代码部分 Visual C/C++环境 建立工程 汇编程序的调试 一.设置断点 二.内存窗口 三.寄存器窗口 四.监视窗口 常用调试命令 字符串输入.输出 printf sprintf scanf 常用Windows API调用 MessageBox 确定函数的声明语句和库文件 读取CPU标识 WinDbg调试工具 实验题:用MessageBox函数显示CPU信息 源自:ht

深度解析VC中的消息传递机制

摘要:Windows编程和Dos编程,一个很大的区别就是,Windows编程是事件驱动,消息传递的.所以,要学好Windows编程,必须 对消息机制有一个清楚的认识,本文希望能够对消息的传递做一个全面的分析. 一.什么是消息? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定 义了一个事件,向Windows发出一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键 都会使Windows发送一个

深度解析VC中的消息(转发)

http://blog.csdn.net/chenlycly/article/details/7586067 这篇转发的文章总结的比较好,但是没有告诉我为什么ON_MESSAGE的返回值必须是LRESULT 摘要: Windows编程和Dos编程,一个很大的区别就是,windows编程是事件驱动,消息传递的.所以,要做好windows编程,必须对消息机制有一个清楚的认识,本文希望能够对消息的传递做一个全面的论述,由于小生初学VC,里面可能有一些错误的地方,还往各位大虾批评.指正. 注意:有些消息

VC中TRACE ASSERT VERIFY之用法

一.TRACE宏 当选择了Debug目标,并且afxTraceEnabled变量被置为TRUE时,TRACE宏也就随之被激活了.但在程序的Release版本中,它们是被完全禁止的.下面是一个典型的TRACE语句: … int nCount =9; CString strDesc("total"); TRACE("Count =%d,Description =%s\n",nCount,strDesc); … 可以看到,TRACE语句的工作方式有点像C语言中的print

VC++的Unicode编程

本文来自:http://tech.ddvip.com/2007-03/117395585321221.html 一.什么是Unicode 先从ASCII说起,ASCII是用来表示英文字符的一种编码规范.每个ASCII字符占用1个字节,因此,ASCII编码可以表示的最大字符数是255(00H—FFH).其实,英文字符并没有那么多,一般只用前128个(00H—7FH,最高位为0),其中包括了控制字符.数字.大小写字母和其它一些符号.而最高位为1的另128个字符(80H—FFH)被称为“扩展ASCII

在C语言中以编程的方式获取函数名

调试常用的 __FILE__, __FUNCTION__, __LINE__ 调试常用的 __FILE__, __FUNCTION__, __LINE__ 没想到 VC6 不支持 __FUNCTION__ 所以我写了如下的奇怪代码 //用来记录当前行和当前函数//也可说是记录 堆栈void log_stack(const char *file, int line, const char * function); //当然还要对 __FUNCTION__ 宏作点修饰,因为这个宏只是在函数里面才起作