徹底解密C 寬字元 5 利用fstream轉換

2021-05-23 02:12:19 字數 1951 閱讀 7450

c++的流和本地化策略集

bs在設計c++流的時候希望其具備智慧型化,並且是可擴充套件的智慧型化,也就是說,c++的流可以「讀懂」一些內容。比如:

std::cout 

<<

123<<

"ok "

<<

std::endl;

這句**中,std::cout是能判斷出123是int而"ok"是const char[3]。利用流的智慧型,甚至可以做一些基礎型別的轉換,比如從int到string,string到int:

std::

string

str(

" 123

" );

std::stringstream sstr(str);

int  i;

sstr 

>>

i;int  i 

=  123

;std::stringstream sstr;

sstr 

<<

i;std::

string

str 

=  sstr.str();

儘管如此,c++並不滿足,c++甚至希望流能「明白」時間,貨幣的表示法。而時間和貨幣的表示方法在世界範圍內是不同的,所以,每乙個流都有自己的locale在影響其行為,c++中叫做啟用(imbue,也有翻譯成浸染)。而我們知道,每乙個locale都有多個facet,這些facet並非總是被use_facet使用的。決定使用哪些facet的,是流的快取basic_streambuf及其派生類basic_stringbuf和basic_filebuf。我們要用到的facet是codecvt,這個facet只被basic_filebuf使用——這就是為什麼只能用fstream來實現寬窄轉換,而無法使用sstream來實現的原因。

標頭檔案:

// filename string_wstring_fstream.hpp

#ifndef string_wstring_fstream_hpp

#define

string_wstring_fstream_hpp

#include 

<

string

>

const

std::wstring s2ws(

const

std::

string

&  s);

const

std::

string

ws2s(

const

std::wstring

&  s);

#endif

實現:#include 

<

string

>

#include 

<

fstream

>

#include 

" string_wstring_fstream.hpp "

const

std::wstring s2ws(

const

std::

string

&  s)

const

std::

string

ws2s(

const

std::wstring

&  s)

在窄到寬的轉化中,我們先使用預設的本地化策略集(locale)將s通過窄檔案流ofs傳入檔案,這是char到char的傳遞,沒有任何轉換;然後我們開啟寬檔案流wifs,並用系統的本地化策略集(locale)去啟用(imbue)之,流在讀回寬串wstr的時候,就是char到wchar_t的轉換,並且因為啟用了sys_loc,所以實現標準窄到寬的轉換。

在寬到窄的轉化中,我們先開啟的是寬檔案流wofs,並且用系統的本地化策略集sys_loc啟用(imbue)之,這時候,因為要寫的檔案cvt_buf是乙個外部編碼,所以執行了從wchar_t到char的標準轉換。讀回來的檔案流從char到char,不做任何轉換。

徹底解密C 寬字元 6 國際化策略(完)

硬編碼的硬傷 我們現在知道,c c 的寬窄轉換是依賴系統的locale的,並且在執行時完成。考慮這樣一種情況,我們在簡體中文windows下編譯如下語句 const char s 中文abc 根據我們之前的討論,編譯器將按照windows codepage936 gb2312 對這個字串進行編碼。如...

C語言中的寬字元

我們接觸的系統 windows linux unix 都是用c語言編寫的,可想而知學好c語言有多麼重要,我們在日常寫 的過程中,大部分接觸的是ascii字元,那麼對於字元變數,我們常用的資料型別是char,但是對於中文字元,用char變數就不行了,那麼就需要使用寬字元了。下面顯示的常用的字元與寬字元...

C語言寬字元輸出和轉換

學習彙總 持續更新 從零搭建後端基礎設施系列 一 背景介紹 在locale.h標頭檔案中有個setlocale函式,它的作用是設定執行時的字符集環境。一般c c 編譯器預設字符集環境為 c 所以你要正常輸出單個中文字元,或者用mbstowcs wcstombs等c庫函式的時候,需要設定字符集環境為中...