在C 11中,如何將一種編碼的string轉換為另一種編碼的string?

時間 2021-06-02 10:20:31

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 類

在C 11中,auto關鍵字的大量使用,會影響編譯速度嗎?

原子筆 沒有測試就別隨便下結論或者杞人憂天吧。編譯器在處理XX a b時,不管XX是auto還是非auto 一樣要去檢視b的型別的,並且需要確認可以拷貝構造。所以理論上來講只會減少編譯時間,包括非自定義型別也類似。 Premature optimization is the root of all ...

你是如何將閱讀作為一種生活方式的?

遇見安苒 有人說 你讀過的書,行過的路,最終都變成了你的閱歷,成為了一種生活。這說的就是一種人們的生活方式。而讀書從古至今,都被很多人作為生活中一種不可或缺的生活方式,因為它會影響到乙個人的性格 生活習慣和氣質內涵。如何把讀書作為一種生活方式?並不需要我們太刻意的去做什麼事情,你只需要做好以下幾點,...

如何將SQL轉化成另一種query語言?

tkanng 可以試下Calcite。LinkedIn Pig Script Samza streaming code Bridging Offline and Nearline Computations with Apache Calcite 這篇文章描述了 LinkedIn 如何使用 Calci...