C++的中英文字符串表示(string,wstring),使用wcout.imbue(std::locale("chs"));本地化解析编码
在C++中字符串類的string的模板原型是basic_string
template<class_Elem,classtraits=char_traits<_Elem>,class_Ax=allocator<_Elem>>
classbasic_string{};
第一個(gè)參數(shù)_Elem表示類型。第二個(gè)參數(shù)traits的缺省值使用char_traits類型,定義了類型和字符操作的函數(shù),如比較、等價(jià)、分配等。第三個(gè)參數(shù)_Ax的默認(rèn)值是allocator類,表示了內(nèi)存模式,不同的內(nèi)存結(jié)構(gòu)將操作指針的不同行為,例如棧、堆或段內(nèi)存模式等。
在C++標(biāo)準(zhǔn)里定義了兩個(gè)字符串string和wstring
typedefbasic_string<char>string;
typedefbasic_string<wchar_t>wstring;
前者string是常用類型,可以看作char[],其實(shí)這正是與string定義中的_Elem=char相一致。而wstring,使用的是wchar_t類型,這是寬字符,用于滿足非ASCII字符的要求,例如Unicode編碼,中文,日文,韓文什么的。對(duì)于wchar_t類型,實(shí)際上C++中都用與char函數(shù)相對(duì)應(yīng)的wchar_t的函數(shù),因?yàn)樗麄兌际菑耐粋€(gè)模板類似于上面的方式定義的。因此也有wcout, wcin, werr等函數(shù)。
實(shí)際上string也可以使用中文,但是它將一個(gè)漢字寫在2個(gè)char中。而如果將一個(gè)漢字看作一個(gè)單位wchar_t的話,那么在wstring中就只占用一個(gè)單元,其它的非英文文字和編碼也是如此。這樣才真正的滿足字符串操作的要求,尤其是國(guó)際化等工作。
看一下下面的程序,就會(huì)理解兩者的差別。
#include<iostream>
#include<string>
usingnamespacestd;
#definetab" "
intmain()
{
localedef;
cout<<def.name()<<endl;
localecurrent=cout.getloc();
cout<<current.name()<<endl;
floatval=1234.56;
cout<<val<<endl;
//chagetofrench/france
cout.imbue(locale("chs"));
current=cout.getloc();
cout<<current.name()<<endl;
cout<<val<<endl;
//上面是說明locale的用法,下面才是本例的內(nèi)容,因?yàn)槠渲杏玫搅薸mbue函數(shù)
cout<<"*********************************"<<endl;
//為了保證本地化輸出(文字/時(shí)間/貨幣等),chs表示中國(guó),wcout必須使用本地化解析編碼
wcout.imbue(std::locale("chs"));
//string英文,正確顛倒位置,顯示第二個(gè)字符正確
stringstr1("ABCabc");
stringstr11(str1.rbegin(),str1.rend());
cout<<"UK	s1	:"<<str1<<tab<<str1[1]<<tab<<str11<<endl;
//wstring英文,正確顛倒位置,顯示第二個(gè)字符正確
wstringstr2=L"ABCabc";
wstringstr22(str2.rbegin(),str2.rend());
wcout<<"UK	ws4	:"<<str2<<tab<<str2[1]<<tab<<str22<<endl;
//string中文,顛倒后,變成亂碼,第二個(gè)字符讀取也錯(cuò)誤
stringstr3("你好么?");
stringstr33(str3.rbegin(),str3.rend());
cout<<"CHN	s3	:"<<str3<<tab<<str3[1]<<tab<<str33<<endl;
//正確的打印第二個(gè)字符的方法
cout<<"CHN	s3	:RIGHT	"<<str3[2]<<str3[3]<<endl;
//中文,正確顛倒位置,顯示第二個(gè)字符正確
wstringstr4=L"你好么?";
wstringstr44(str4.rbegin(),str4.rend());
wcout<<"CHN	ws4	:"<<str4<<tab<<str4[1]<<tab<<str44<<endl;
wstringstr5(str1.begin(),str1.end());//只有char類型的string時(shí)才可以如此構(gòu)造
wstringstr55(str5.rbegin(),str5.rend());
wcout<<"CHN	ws5	:"<<str5<<tab<<str5[1]<<tab<<str55<<endl;
wstringstr6(str3.begin(),str3.end());//如此構(gòu)造將失敗!!!!
wstringstr66(str6.rbegin(),str6.rend());
wcout<<"CHN	ws6	:"<<str6<<tab<<str6[1]<<tab<<str66<<endl;
return0;
}
結(jié)果如下:
上面顯示了本地化的作用,是在數(shù)字中每三位加一個(gè)逗號(hào),其實(shí)對(duì)時(shí)間/文字等都是用影響的。
下面的輸出說明了,如何正確使用string和wstring的方法。第三個(gè)因?yàn)槭褂胹tring來表示漢字,出現(xiàn)了一些錯(cuò)誤。最后一行也是錯(cuò)誤,導(dǎo)致了輸出也受到了影響,沒有空格與回車。(最后兩個(gè)就不要管中英文了,僅僅說明一下中文構(gòu)造方法是錯(cuò)誤的)
《掌握標(biāo)準(zhǔn)C++類》在第十二章《語言支持》中專門講C++的國(guó)際化和本地化問題,C++提供了I18N的標(biāo)準(zhǔn)處理,軟件開發(fā)者可以參考。
C++標(biāo)準(zhǔn)庫還是非常博大精深的,功能比較齊全的。繼續(xù)學(xué)習(xí)。
http://www.cnblogs.com/xiaoyz/archive/2008/10/11/1308860.html
總結(jié)
以上是生活随笔為你收集整理的C++的中英文字符串表示(string,wstring),使用wcout.imbue(std::locale("chs"));本地化解析编码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: RMB符号的几种显示方式。
 - 下一篇: mongo服务启动异常:exiting