C++實(shí)現(xiàn)字符格式相互轉(zhuǎn)換的示例代碼
更新時間:2022年11月15日 11:20:19 作者:歐特克_Glodon
這篇文章主要為大家詳細(xì)介紹了C++中實(shí)現(xiàn)字符格式相互轉(zhuǎn)換的方法,主要有UTF8與string互轉(zhuǎn)、wstring與string互轉(zhuǎn),感興趣的小伙伴可以了解一下
一、UTF8轉(zhuǎn)std:string
std::string UTF8_To_string(const std::string& str) { int nwLen = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0); wchar_t* pwBuf = new wchar_t[nwLen + 1]; //一定要加1,不然會出現(xiàn)尾巴 memset(pwBuf, 0, nwLen * 2 + 2); MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), pwBuf, nwLen); int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL); char* pBuf = new char[nLen + 1]; memset(pBuf, 0, nLen + 1); WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL); std::string strRet = pBuf; delete[]pBuf; delete[]pwBuf; pBuf = NULL; pwBuf = NULL; return strRet; }
二、string_To_UTF8
std::string string_To_UTF8(const std::string& str) { int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0); wchar_t* pwBuf = new wchar_t[nwLen + 1]; //一定要加1,不然會出現(xiàn)尾巴 ZeroMemory(pwBuf, nwLen * 2 + 2); ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen); int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL); char* pBuf = new char[nLen + 1]; ZeroMemory(pBuf, nLen + 1); ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL); std::string strRet(pBuf); delete[]pwBuf; delete[]pBuf; pwBuf = NULL; pBuf = NULL; return strRet; }
三、wstring轉(zhuǎn)string
std::string wstring2string(std::wstring wstr) { string result; int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL); if (len <= 0)return result; char* buffer = new char[len + 1]; if (buffer == NULL)return result; WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL); buffer[len] = '\0'; result.append(buffer); delete[] buffer; return result; }
四、string轉(zhuǎn)wstring
std::wstring string2wstring(std::string str) { wstring result; int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0); if (len < 0)return result; wchar_t* buffer = new wchar_t[len + 1]; if (buffer == NULL)return result; MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len); buffer[len] = '\0'; result.append(buffer); delete[] buffer; return result; }
五、unicode屬性和多字節(jié)屬性轉(zhuǎn)換(char轉(zhuǎn)wchar_t)
// WideChar.cpp : 定義控制臺應(yīng)用程序的入口點(diǎn)。 // #include "stdafx.h" #include <windows.h> #include <iostream> #include <atlbase.h> //#include <comutil.h> #include <atlstr.h> using namespace std; //方法1:MultiByteToWideChar, WideCharToMultiByte void Way_1() { //char轉(zhuǎn)wchar_t char *p1 = "abc"; wchar_t p2[20] = L"EFG"; MultiByteToWideChar(CP_ACP, 0, p1, strlen(p1) + 1, p2, sizeof(p2)); printf("%S\n", p2); //wchar_t轉(zhuǎn)char wchar_t *p3= L"EFG"; char p4[20]; WideCharToMultiByte(CP_ACP, 0, p3, -1, p4, sizeof(p4), NULL, NULL); printf("%s\n", p4); } //方法2:A2W, W2A, T2A, A2T void Way_2() { //需要添加頭文件 <atlbase.h> char * p1 = "abc"; wchar_t *p2 = L"def"; TCHAR *P3 = _T("CC"); USES_CONVERSION; wchar_t *p5 = A2W(p1); char * p4 = T2A(P3); } 方法3: //void Way_3() //{//需要添加頭文件<comutil.h>,一般在MFC工程下使用 // CString str = "abc";//只能存一種 // _bstr_t bstr = "abc";//可以用非unicode // bstr += L"efg";//可以用unicode // char *p = bstr; // wchar_t *p2 = bstr; //} int main() { Way_1(); //Way_2(); return 0; }
六、Unicode ansi utf8轉(zhuǎn)換
int Unicode2UTF8(const wchar_t* pUnicode, char* pUTF8Buffer, int nBufferSize) { if( (nBufferSize == 0) && (pUTF8Buffer != NULL) ) return 0; int result = WideCharToMultiByte(CP_UTF8, NULL, pUnicode, -1, pUTF8Buffer, nBufferSize, NULL, NULL); if ((result > 0) && (pUTF8Buffer != NULL)) pUTF8Buffer[result-1] = 0; return result; } int UTF82Unicode(const char* pUTF8, wchar_t* pUnicodeBuffer, int nBufferSize) { if( (nBufferSize == 0) && (pUnicodeBuffer != NULL) ) return 0; int result = MultiByteToWideChar(CP_UTF8, NULL, pUTF8, -1, pUnicodeBuffer, nBufferSize); if ((result > 0) && (pUnicodeBuffer != NULL)) pUnicodeBuffer[result-1] = 0; return result; } int Unicode2Ansi(const wchar_t* pUnicode, char* pAnsiBuffer, int nBufferSize) { if( (nBufferSize == 0) && (pAnsiBuffer != NULL) ) return 0; int result = ::WideCharToMultiByte(CP_ACP, 0, pUnicode, -1, pAnsiBuffer, nBufferSize, NULL, NULL); if ((result > 0) && (pAnsiBuffer != NULL)) pAnsiBuffer[result-1] = 0; return result; } int Ansi2Unicode(const char* pAnsi, wchar_t* pUnicodeBuffer, int nBufferSize) { if( (nBufferSize == 0) && (pUnicodeBuffer != NULL) ) return 0; int result = ::MultiByteToWideChar(CP_ACP, 0, pAnsi, -1, pUnicodeBuffer, nBufferSize); if ((result > 0) && (pUnicodeBuffer != NULL)) pUnicodeBuffer[result-1] = 0; return result; }
簡單實(shí)用
CString strBuf; int nSize = Unicode2UTF8(strBuf, NULL, 0); char* szBuf = new char[nSize]; Unicode2UTF8(strBuf, szBuf, nSize);
以上就是C++實(shí)現(xiàn)字符格式相互轉(zhuǎn)換的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C++字符格式互換的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語言中feof函數(shù)和ferror函數(shù)示例詳解
在C語言中feof函數(shù)用于檢查文件流的結(jié)束標(biāo)志,判斷文件在讀取時是否已經(jīng)到達(dá)了文件的末尾,這篇文章主要給大家介紹了關(guān)于C語言中feof函數(shù)和ferror函數(shù)的相關(guān)資料,需要的朋友可以參考下2024-09-09Linux下實(shí)現(xiàn)C++操作Mysql數(shù)據(jù)庫
由于工作需要抽出一周的時間來研究C/C++訪問各種數(shù)據(jù)庫的方法,并打算封裝一套數(shù)據(jù)庫操作類,現(xiàn)在奉上最簡單的一部分:在Linux下訪問MySQL數(shù)據(jù)庫。2017-05-05C語言實(shí)現(xiàn)輸入一個字符串后打印出該字符串中字符的所有排列
這篇文章主要介紹了C語言實(shí)現(xiàn)輸入一個字符串后打印出該字符串中字符的所有排列的方法,是數(shù)學(xué)中非常實(shí)用的排列算法,需要的朋友可以參考下2014-09-09詳解Matlab繪制3D玫瑰花的方法(內(nèi)附旋轉(zhuǎn)版本)
這篇文章主要為大家介紹了如何利用Matlab繪制3D版的玫瑰花以及旋轉(zhuǎn)版的3D玫瑰花,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動手試一試2022-03-03