C++ 字符集unicode和多字節的數據類型差別很大,搞這個費了好長的功夫。就把過程中遇到的問題記錄下,大都是網上找的,鏈接太多七七八八也不好貼是哪位博主了,主要方便自己查閱,投個原創請見諒
1. const char* 字符串 以 “\0”結尾。
2. char[] 字符串 以 “\0”結尾。
3.string 字符串 不以 “\0”結尾。
4. char[n] = "string", 當string 長度+“\0”>n時,會因空間不足出錯。
5.string.c_str() 轉 const char* 時, 會在字符串末尾 自動補“\0”
6.char* 轉string 時, 會自動把末尾的 “\0” 去掉。
7.strlen()是取字符串除去結尾符 “\0” 的長度。
8.sizeof()是包含‘\0’的長度
9.帶有‘\0’和不帶有‘\0’的兩個字符串是無法相等的。
1.const char * 轉 wchar_t*類型:
//const char*轉wchar_t*
wchar_t* charToWChart(const char *str)
{
int length = strlen(str)+1;
wchar_t *t = (wchar_t*)malloc(sizeof(wchar_t)*length);
memset(t,0,length*sizeof(wchar_t));
MultiByteToWideChar(CP_ACP,0,str,strlen(str),t,length);
return t;
}
2.std::string字符串替換
//替換字符串
//@param: pszSrc:原先字符串
//@param: pszOld:需要替換的字符串
//@param: pszNew:替換的新字符串
//@return:替換完成的字符串
static std::string replace_str(const char *pszSrc, const char *pszOld, const char *pszNew)
{
std::string strContent, strTemp;
strContent.assign( pszSrc );
std::string::size_type nPos = 0;
while( true )
{
nPos = strContent.find(pszOld, nPos);
strTemp = strContent.substr(nPos+strlen(pszOld), strContent.length());
if ( nPos == std::string::npos )
{
break;
}
strContent.replace(nPos,strContent.length(), pszNew );
strContent.append(strTemp);
nPos +=strlen(pszNew) - strlen(pszOld)+1; //防止重複替換 避免死循環
}
return strContent;
}
3.char*轉std::wstring
std::wstring charToWstring(char* szIn)
{
int length = MultiByteToWideChar(CP_ACP, 0, szIn, -1, NULL, 0);
WCHAR* buf = new WCHAR[length+1];
ZeroMemory(buf, (length + 1) * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, szIn, -1, buf, length);
std::wstring strRet(buf);
delete[] buf;
return strRet;
}
4.wchar_t*轉std::string
std::string w2a(wchar_t* szIn)
{
int nSize = WideCharToMultiByte(CP_ACP, 0, szIn, -1, NULL, NULL, NULL, NULL);
char* buffer = new char[nSize+1];
ZeroMemory(buffer,nSize+1);
WideCharToMultiByte(CP_ACP, 0, szIn, -1, buffer, nSize, NULL, NULL);
std::string strRet(buffer);
delete[] buffer;
return strRet;
}
5.std::string判斷結尾是否包含某字符:
//判斷字符串結尾是否包含某字符;
//[in]s:字符串,[in]sub:包含字符
//return:1:包含 0:包含
bool endsWith(std::string s, std::string sub) {
return s.rfind(sub) == (s.length() - sub.length()) ? true : false;
}
6.分割字符串
//分割字符串
std::vector<std::string> split_str(std::string str, std::string pat)
{
std::vector<std::string> bufStr;
while (true)
{
int index = str.find(pat);
std::string subStr = str.substr(0, index);
if (!subStr.empty())
bufStr.push_back(subStr);
str.erase(0, index + pat.size());
if (index == -1)
break;
}
return bufStr;
}
在字符串無法直接賦值使用_T
CString = _T("test");