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庫函式的時候,需要設定字符集環境為中...