1樓:keyes
vc下有個BSTR,很方便。
string to wstring
string
str=
"hello知乎"
;_bstr_tt=
str.
c_str
();wstring
wstr=t
;wstring to string
wstring wstr = L"hello知乎";
_bstr_t t = wstr.c_str();
string str = t;
2樓:Gomo Psivarh
C++11的std::wstring_convert配合std::codecvt模板類完全可以解決這個問題,不會出現@vczh 所說修改了全域性locale會導致汙染其他庫的問題。
這兩個模板類的功能是:
std::wstring_convert:轉碼器,接收乙個類似codecvt描述編碼轉換特性的模板引數,用於將本地化的寬字元wstring和指定編碼的位元組化string進行互轉。
std::codecvt:編碼轉換特性類,用在wstring_convert的模板引數中來指定使用哪種編碼。
所以編碼A和B互轉的實現方式就是:借助本地化寬字串,先將以A編碼的string轉為本地化的wstring,再將本地化的wstring轉為B編碼後的string。
codecvt一般使用下面兩個特化子類:
std::codecvt_utf8:用於UTF8和本地化wchar_t的互轉
std::codecvt_byname:用於其他編碼(例如GBK)和本地化wchar_t的互轉,類的建構函式需要傳入編碼的locale name,由於編碼的locale name是作業系統決定的(例如GBK在linux下的locale名可能是"zh_CN.
GBK",而windows下是".936"),因此做跨平台的話仍然要給不同的系統做適配。
這裡給乙個windows下,GBK string轉UTF8 string的例子:
首先將GBK string轉wstring
const
char
*GBK_LOCALE_NAME
=".936"
;//GBK在windows下的locale name
string
gbk_str
;//0xCCCC,"燙"的GBK碼
//構造GBK與wstring間的轉碼器(wstring_convert在析構時會負責銷毀codecvt_byname,所以不用自己delete)
wstring_convert
,char ,mbstate_t >>cv1( newcodecvt_byname ,char ,mbstate_t >(GBK_LOCALE_NAME ));wstring tmp_wstr =cv1 .from_bytes (gbk_str );再將wstring轉為UTF8 string wstring_convert >>cv2; string utf8_str=cv .to_bytes (tmp_wstr );轉碼就完成了。utf8_str裡的內容應該是"\xE7\x83\xAB"(燙的UTF8)。 3樓: GCC 5.0 libc++ 還有 Visual C++ 2012 支援編碼轉換 ,標頭檔案是 codecvt, bool WideStringToString (const std:: wstring &src ,std ::string &str); auto result =std ::use_facet >(sys_locale ).out (out_state ,data_from ,data_from_end ,data_from_next ,data_to ,data_to_end ,data_to_next );if (result ==convert_facet ::ok )delete data_to ;return false;} bool StringToWideString (const std:: string &src ,std ::wstring &wstr); auto result =std ::use_facet >(sys_locale ).in (in_state ,data_from ,data_from_end ,data_from_next ,data_to ,data_to_end ,data_to_next );if (result ==convert_facet ::ok )delete data_to ;return false;} bool WCharStringToUTF8String(const std:: wstring &wstr ,std ::string &u8str )bool UTF8StringToWCharString(const std:: string &u8str ,std ::wstring &wstr) 4樓:noname 題主可以參考 std::codecvt 和 std::wstring_convert wstring_convert 類 原子筆 沒有測試就別隨便下結論或者杞人憂天吧。編譯器在處理XX a b時,不管XX是auto還是非auto 一樣要去檢視b的型別的,並且需要確認可以拷貝構造。所以理論上來講只會減少編譯時間,包括非自定義型別也類似。 Premature optimization is the root of all ... 遇見安苒 有人說 你讀過的書,行過的路,最終都變成了你的閱歷,成為了一種生活。這說的就是一種人們的生活方式。而讀書從古至今,都被很多人作為生活中一種不可或缺的生活方式,因為它會影響到乙個人的性格 生活習慣和氣質內涵。如何把讀書作為一種生活方式?並不需要我們太刻意的去做什麼事情,你只需要做好以下幾點,... tkanng 可以試下Calcite。LinkedIn Pig Script Samza streaming code Bridging Offline and Nearline Computations with Apache Calcite 這篇文章描述了 LinkedIn 如何使用 Calci...在C 11中,auto關鍵字的大量使用,會影響編譯速度嗎?
你是如何將閱讀作為一種生活方式的?
如何將SQL轉化成另一種query語言?