主题:SStringT和std::string的转换

admin 2018年12月08日 70

SOUI提供了SStringA, SStringW来表示字符串。和std::string, std::wstring对应。一个表示多字节字符串,一个表示宽字符串。 

SOUI提供了一组字符串编码转换的宏:



namespace SOUI
{

    class UTILITIES_API SStrCpCvt
    {
    public:
        static SStringA CvtW2A(const SStringW & str,unsigned int cp=CP_ACP);

        static SStringW CvtA2W(const SStringA & str,unsigned int cp=CP_ACP,unsigned int cp2=0);

        static SStringA CvtA2A(const SStringA & str,unsigned int cpFrom=CP_UTF8,unsigned int cpTo=CP_ACP);

        static SStringW CvtW2W(const SStringW &str,unsigned int cp=CP_ACP);

    };


}//end of namespace SOUI

#define S_CA2W SStrCpCvt::CvtA2W
#define S_CW2A SStrCpCvt::CvtW2A
#define S_CA2A SStrCpCvt::CvtA2A
#define S_CW2W SStrCpCvt::CvtW2W

#ifdef UNICODE
#define S_CA2T S_CA2W
#define S_CT2A S_CW2A
#define S_CW2T S_CW2W
#define S_CT2W S_CW2W
#else
#define S_CA2T S_CA2A
#define S_CT2A S_CA2A
#define S_CW2T S_CW2A
#define S_CT2W S_CA2W
#endif // UNICODE

使用上述宏可以完成基本上所有的编码转换。

 很多人不知道如何把SStringA转换成std::string. 

关键原因可能是分不清char *, const char*, LPCSTR这几个类型。

 LPCSTR展开就是const char*. SStringA可以自动转换成LPCSTR. 

比如:SStringA str="abc";LPCSTR str2 = str;//这是合法的,

等价于 str2 = (LPCSTR)str;std::string str3 = str;//这也是合法的。

 但是char * str4=str;//这是不合法的,编译不了。

 如果一定要用char*可以用下面的方法:char * str5 = str.GetBuffer(1000);....str.ReleaseBuffer();//这一句很重要。 

也可以用下面的方法: 

char *str6=str.LockBuffer();...str.UnlockBuffer();GetBuffer可以分配需要的空间,LockBuffer则只改变内部的引用计数。 

它们都需要后面的ReleaseBuffer, UnlockBuffer来配对使用。

 std::string转换成SStringA就简单了: 

std::string str="abc";SStringA str2=str.c_str();  //需要执行strlen来计算长度。 

orSStringA str3(str.c_str(),str.length());