windows开发中的字符串问题的大集合

在windows的开发中,我想,很多人都会遇到字符串乱码;字符串拷贝不正确;在已经赋值的字符串,另一个字符串进行拷贝,发现值不对;或者编码方式不正确;宽字符,非宽字符等问题;


下面我将统一整理下这下问题,把常用的一些CString,std::string,std::wstring,char,TCHAR,WCHAR的一些相关函数和转换的关系进行整理。


先介绍几种在windows开发中,常用的几种字符串类型

char是类型TCHAR也是!不过他可以通过是否定义了UNICODE宏来判断到底是char还是w_char;

TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用同样的代码,不需要使用繁琐的宏定义来包含你的代码,而char代表ASCII的字符

基本类型
#ifndef VOID
#define VOID void
typedef char CHAR;
typedef short SHORT;
typedef long LONG;
#endif

如果定义了宏ANSI(单字节)

//
// ANSI (Multi-byte Character) types
//
typedef CHAR *PCHAR, *LPCH, *PCH;
typedef CONST CHAR *LPCCH, *PCCH;

typedef __nullterminated CHAR *NPSTR, *LPSTR, *PSTR;
typedef __nullterminated PSTR *PZPSTR;
typedef __nullterminated CONST PSTR *PCZPSTR;
typedef __nullterminated CONST CHAR *LPCSTR, *PCSTR;
typedef __nullterminated PCSTR *PZPCSTR;
也即,

(1)LPSTR:即 char *(TCHAR*),指向以'\0'结尾的8位(单字节)ANSI字符数组指针  >>>>>>>>>>  等价于ANSI下的LPTSTR;

(LPSTR是一个指向以‘\0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR);

(2)LPCSTR:即const char *,CONST CHAR*;


如果定义了宏UNICODE(双字节)

typedef WCHAR TCHAR, *PTCHAR;
typedef WCHAR TBYTE , *PTBYTE ;

typedef LPWSTR LPTCH, PTCH;
typedef LPWSTR PTSTR, LPTSTR;
typedef LPCWSTR PCTSTR, LPCTSTR;
typedef LPUWSTR PUTSTR, LPUTSTR;
typedef LPCUWSTR PCUTSTR, LPCUTSTR;
typedef LPWSTR LP;
也即,

(1)LPWSTR:即wchar_t *(TCHAR*,WCHAR*),指向'\0'结尾的16位(双字节)Unicode字符数组指针 >>>>>>>>>>  等价于UNICODE下的LPTSTR;

(2)LPCWSTR:即const wchar_t *,CONST WCHAR*;


还有个要注意的:

#ifdef UNICODE

    typedef LPWSTR LPTSTR;

    typedef LPCWSTR LPCTSTR;

#else

    typedef LPSTR LPTSTR;

    typedef LPCSTR LPCTSTR;

#endif


下面介绍UNICODE与ANSI之间的转换:

(1)

USES_CONVERSION;
1.ANSI->UNICODE:     A2W();

2.UNICODE->ANSI:     W2A();
注:用A2W,或者W2A需要用宏USES_CONVERSION;


(2)用API函数MultiByteToWideChar() 和WideCharToMultiByte()

这两个函数的应用详见后文的MultiByteToWideChar() 和WideCharToMultiByte()的运用一文;


下面是TCHAR*,CString,std::string,std::wstring之间的转换

// ***********************************************************************
// * 函数: TransCStringToTCHAR
// * 描述:将CString 转换为 TCHAR*
// * author: Justin
// * 日期:
// ***********************************************************************
TCHAR* CString2TCHAR(CString &str)
{
	int nLen = str.GetLength();
	TCHAR* szInfo = new TCHAR[iLen]; // 长度是否需要+1
	lstrcpy(szInfo, str.GetBuffer(iLen));
	str.ReleaseBuffer();
	return szInfo;
}

// ***********************************************************************
// * 函数: TCHAR2CString
// * 描述:将CString 转换为 TCHAR*
// * author: Justin
// * 日期:
// ***********************************************************************
CString TCHAR2CString(TCHAR *szInfo)
{
    //CString strTemp(szInfo);  (first)
    CString strTemp;
    strTemp.Format(_T("%s"),szInfo);  
    return strTemp;
}

// ***********************************************************************
// * 函数: TransstringToTCHAR
// * 描述:将std::string 转换为 TCHAR*
// * author: Justin
// * 日期:
// ***********************************************************************
TCHAR* string2TCHAR(std::string str)
{ 
	return str.c_str();
}

// ***********************************************************************
// * 函数: wstringToTCHAR
// * 描述:将std::string 转换为 TCHAR*(WCHAR*, PCHAR)
// * author: Justin
// * 日期:
// ***********************************************************************
TCHAR* wstring2TCHAR(std::wstring wstr)
{ 
	return wstr.c_str();
}

// ***********************************************************************
// * 函数: TCHARtostring
// * 描述:将std::string 转换为 TCHAR*(WCHAR*, PCHAR)
// * author: Justin
// * 日期:
// ***********************************************************************
std::string wstring2TCHAR(TCHAR* tszInfo)
{ 
	std::string str(tszInfo);
	return str;
}


// ***********************************************************************
// * 函数: CStringToLPSTR
// * 描述:将CString 转换为 LPSTR
// * author: Justin
// * 日期:
// ***********************************************************************
LPSTR CStringToLPSTR(CString &str)
{
	// LPSTR lpStr = strFileName.GetBuffer(strFileName.GetLength());
	int nLen = str.GetLength();
	char* szInfo = new char[nLen]; // 长度是否需要+1
	strcpy(szInfo, str.GetBuffer(nLen))
	str.ReleaseBuffer();
	return szInfo;
}

// ***********************************************************************
// * 函数: CStringToLPWSTR
// * 描述:将CString 转换为 LPWSTR
// * author: Justin
// * 日期:
// ***********************************************************************
LPWSTR CStringToLPWSTR(CString &str)
{
	// LPSTR lpStr = strFileName.GetBuffer(strFileName.GetLength());
	int nLen = str.GetLength();
	WCHAR* szInfo = new WCHAR[nLen]; // 长度是否需要+1

	wcscpy(szInfo, str.GetBuffer(nLen));
		str.ReleaseBuffer();
	return szInfo;
}



建议:

(1)在windows的开发中,工程的编码方式尽量用UNICODE;

(2)尽量使用TCHAR,不用char,WCHAR;

(3)少用W2A,A2W,用多自己的转换的api函数;




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值