瀵笴++ Local鐨勭粡鍏稿垎鏋?/h2>

鏈創(chuàng)杞澆鑷細(xì)鍐嶅埆嫻佸勾鐨勬妧鏈疄楠屽

鏂囩珷鍦板潃錛? http://kittsoft.xp3.biz/?p=86

“榪欎釜闂姣斾綘鎯寵薄涓鏉?#8221;
錛堟垜涔熷涓婤S鐨勯鏍鹼紝铏界劧榪欏彞璇濇槸鎴戣嚜宸變復(fù)鏃舵兂璇寸殑銆俕^錛?br /> 浠庡瓧絎﹀埌鏁存暟
char鏄竴縐嶆暣鏁扮被鍨嬶紝榪欏彞璇濈殑鍚箟鏄紝char鎵鑳借〃紺虹殑瀛楃鍦–/C++涓兘鏄暣鏁扮被鍨嬨傚ソ錛屾帴涓嬫潵錛屽緢澶氭枃绔犲氨浼?xì)鋴D鍑轟竴涓吀鍨嬩緥瀛愶紝姣斿錛?#8217;a' 鐨勬暟鍊煎氨鏄?×61銆傝繖縐嶈娉曞鍚楋紵濡傛灉浣犵粏蹇?jī)鐨勮杩嘖&R鍜孊S瀵逛簬C鍜孋++鎻忚堪鐨勫師钁楋紝浣犲氨浼?xì)椹笂鍙嶉┏閬撳Q?×61鍙槸’a'鐨凙SCII 鍊鹼紝騫舵病鏈変換浣曡瀹欳/C++鐨刢har鍊煎繀欏誨搴擜SCII銆侰/C++鐢氳嚦娌℃湁瑙勫畾char鍗犲嚑浣嶏紝鍙槸瑙勫畾浜?jiǎn)sizeof(char)絳変簬1銆?br /> 褰撶劧錛岀洰鍓嶅ぇ閮ㄥ垎鎯呭喌涓嬶紝char鏄?浣嶇殑錛屽茍涓旓紝鍦ˋSCII鑼冨洿鍐呯殑鍊鹼紝涓嶢SCII瀵瑰簲銆?br /> 鏈湴鍖栫瓥鐣ラ泦錛坙ocale錛?br /> “灝?#8217;a'緲昏瘧鎴?×61鐨勬暣鏁板?#8221;錛?#8220;灝咥SCII鑼冨洿鍐呯殑緙栫爜涓巆har鐨勬暣鏁板煎搴旇搗鏉?#8221;錛岀被浼艱繖鏍風(fēng)殑瑙勫畾錛屾槸鐗瑰畾緋葷粺鍜岀壒瀹氱紪璇戝櫒鍒跺畾 鐨勶紝C/C++涓湁涓壒瀹氱殑鍚嶈瘝鏉ユ弿榪拌繖縐嶈瀹氱殑闆嗗悎錛氭湰鍦板寲絳栫暐闆嗭紙locale銆備篃鏈夌炕璇戞垚“鐜板満”錛夈傝岀炕璇?#8212;—涔熷氨鏄唬鐮佽漿鎹紙codecvt錛?鍙槸榪欎釜闆嗗悎涓殑涓涓紝C++涓畾涔変負(fù)絳栫暐錛坒acet銆備篃鏈夌炕璇戜負(fù)“鍒婚潰”錛?br /> C/C++鐨勭紪璇戠瓥鐣?br /> “鏈湴鍖栫瓥鐣ラ泦”鏄釜寰堝ソ鐨勬蹇碉紝鍙儨鍦ㄥ瓧絎﹀拰瀛楃涓茶繖涓眰闈笂錛孋/C++騫朵笉浣跨敤錛圕++鐨刲ocale閫氬父鍙槸褰卞搷嫻侊紙stream錛夛級(jí)錛孋/C++浣跨敤鏇寸洿鎺ョ畝鍗曠殑絳栫暐錛氱‖緙栫爜銆?br /> 綆鍗曠殑璇達(dá)紝瀛楃錛堜覆錛夊湪紼嬪簭鏂囦歡錛堝彲鎵ц鏂囦歡錛岄潪婧愭枃浠訛級(jí)涓殑琛ㄧず錛屼笌鍦ㄧ▼搴忔墽琛屼腑鍦ㄥ唴瀛樹(shù)腑鐨勮〃紺轟竴鑷淬傝冭檻涓ょ鎯呭喌錛?br /> A銆乧har c = 0×61;
B銆乧har c = ‘a’;
鎯呭喌A(chǔ)涓嬶紝緙栬瘧鍣ㄥ彲浠ョ洿鎺ヨ璇嗕綔涓烘暣鏁扮殑c錛屼絾鏄湪鎯呭喌B涓嬶紝緙栬瘧鍣ㄥ繀欏誨皢’a'緲昏瘧鎴愭暣鏁般傜紪璇戝櫒鐨勭瓥鐣ヤ篃寰堢畝鍗曪紝灝辨槸鐩存帴璇誨彇瀛楃錛堜覆錛夊湪婧愭枃浠朵腑鐨勭紪鐮佹暟鍊箋傛瘮濡傦細(xì)
const char* s = “涓枃abc”;
榪欐瀛楃涓插湪GB2312錛圵indows 936錛夛紝涔熷氨鏄垜浠殑windows榛樿涓枃緋葷粺婧愭枃浠朵腑鐨勭紪鐮佷負(fù)錛?br /> 0xD6   0xD0   0xCE 0xC4 0×61 0×62 0×63
鍦║TF-8錛屼篃灝辨槸Linux榛樿緋葷粺婧愭枃浠朵腑鐨勭紪鐮佷負(fù)錛?br /> 0xE4   0xB8   0xAD   0xE6   0×96   0×87   0×61   0×62   0×63
涓鑸儏鍐典笅錛岀紪璇戝櫒浼?xì)蹇犲疄浜庢簮鏂囦欢鐨劸~栫爜涓簊璧嬪鹼紝渚嬪鐨勬儏鍐墊瘮濡俈C浼?xì)鑷綔鑱槑鐨勬妸澶ч儴鍒嗗叾浠柧c誨瀷緙栫爜鐨勫瓧絎︿覆杞崲鎴怗B2312錛堥櫎浜?jiǎn)鍍廢TF-8 without signature榪欐牱鐨勫垢瀛樿咃級(jí)銆?br /> 紼嬪簭鍦ㄦ墽琛岀殑鏃跺欙紝s涔熷氨淇濇寔鏄繖鏍風(fēng)殑緙栫爜錛屼笉浼?xì)鍐嶅仛鍏朵粬鐨勮浆鎹€?br /> 瀹藉瓧絎?wchar_t
姝echar娌℃湁瑙勫畾澶у皬錛寃char_t鍚屾牱娌℃湁鏍囧噯闄愬畾錛屾爣鍑嗗彧鏄姹備竴涓獁char_t鍙互琛ㄧず浠諱綍緋葷粺鎵鑳借璇嗙殑瀛楃錛屽湪win32 涓紝wchar_t涓?6浣嶏紱Linux涓槸32浣嶃倃char_t鍚屾牱娌℃湁瑙勫畾緙栫爜錛屽洜涓篣nicode鐨勬蹇墊垜浠悗闈㈡墠瑙i噴錛屾墍浠ヨ繖閲屽彧鏄彁涓涓嬶紝鍦?win32涓紝wchar_t鐨勭紪鐮佹槸UCS-2BE錛涜孡inux涓槸UTF-32BE錛堢瓑浠蜂簬UCS-4BE錛夛紝涓嶈繃綆鍗曠殑璇達(dá)紝鍦?6浣嶄互鍐咃紝涓涓瓧 絎︾殑榪?縐嶇紪鐮佸兼槸涓鏍風(fēng)殑銆傚洜姝わ細(xì)
const wchar_t* ws = L”涓枃abc”;
鐨勭紪鐮佸垎鍒負(fù)錛?br /> 0x4E2D   0×6587    0×0061   0×0062   0×0063                                                //win32錛?6浣?br /> 0x00004E2D   0×00006587    0×00000061   0×00000062   0×00000063        //Linux錛?2浣?br /> 澶у啓鐨凩鏄憡璇夌紪璇戝櫒錛氳繖鏄瀛楃涓層傛墍浠ワ紝榪欐椂鍊欐槸闇瑕佺紪璇戝櫒鏍規(guī)嵁locale鏉ヨ繘琛岀炕璇戠殑銆?br /> 姣斿錛屽湪Windows鐜涓紝緙栬瘧鍣ㄧ殑緲昏瘧絳栫暐鏄疓B2312鍒癠CS-2BE錛汱inux鐜涓殑絳栫暐鏄疷TF-8鍒癠TF-32BE銆?br /> 榪欐椂鍊欏氨瑕佹眰婧愭枃浠剁殑緙栫爜涓庣紪璇戝櫒鐨勬湰鍦板寲絳栫暐闆嗕腑浠g爜緲昏瘧鐨勭瓥鐣ヤ竴鑷達(dá)紝渚嬪VC鍙兘璇誨彇GB2312鐨勬簮浠g爜錛堣繖閲岃繕鏄緥澶栵紝VC澶嚜浣滆仾鏄庝簡(jiǎn) 錛屼細(xì)灝嗗緢澶氬叾浠栦唬鐮佸湪緙栬瘧鏃惰嚜鍔ㄨ漿鎹㈡垚GB2312錛夛紝鑰実cc鍙兘璇誨彇UTF-8鐨勬簮浠g爜錛堣繖閲屽氨鏈変釜灝村艾錛孧inGW榪愯win32涓嬶紝鎵浠ュ彧鏈?GB2312緋葷粺鎵嶈錛涜孧inGW鍗寸敤gcc緙栧啓錛屾墍浠ヨ嚜宸卞彧璁TF-8錛屾墍浠ョ粨鏋滃氨鏄紝MinGW鐨勫瀛楃琚簾鎺変簡(jiǎn)錛夈?br /> 瀹藉瓧絎︼紙涓詫級(jí)鐢辯紪璇戝櫒緲昏瘧錛岃繕鏄紜紪鐮佽繘紼嬪簭鏂囦歡涓?/p>

Unicode鍜孶CS
Unicode鍜孶CS鏄袱涓嫭绔嬬殑緇勭粐鍒嗗埆鍒跺畾鐨勪竴濂楃紪鐮佹爣鍑嗭紝浣嗘槸鍥犱負(fù)鍘嗗彶鐨勫師鍥狅紝榪欎袱濂楁爣鍑嗘槸瀹屽叏涓鏍風(fēng)殑銆俇nicode榪欎釜璇嶇敤寰楁瘮杈冨鐨勫師鍥犲彲 鑳芥槸鍥犱負(fù)姣旇緝瀹規(guī)槗璁頒綇錛屽鏋滄病鏈夌壒鍒殑澹版槑錛屽湪鏈枃鎵鎻愬強(qiáng)鐨刄nicode鍜孶CS灝辨槸涓涓剰鎬濄俇nicode鐨勭洰鏍囨槸寤虹珛涓濂楀彲浠ュ寘鍚漢綾繪墍鏈夎璦鏂?瀛楃鍙蜂綘鎯沖緱鍒版兂涓嶅埌鐨勫悇縐嶄笢瑗跨殑緙栫爜錛屽叾緙栫爜瀹歸噺鐢氳嚦棰勭暀浜?jiǎn)鐏槦璇互鍙?qiáng)閾舵渤緋諱互澶栬璦鐨勭┖闂?#8212;—寮涓帺絎戯紝鍙嶆綆鍗曠殑璇達(dá)紝Unicode緙栫爜闆嗚凍澶熺殑 澶э紝濡傛灉鐢ㄨ綆楁満鍗曚綅鏉ヨ〃紺猴紝鍏舵暟閲忔瘮3涓瓧鑺傚ぇ涓浜涳紝涓嶅埌4涓瓧鑺傘?br /> Unicode鍜孶TF
鍥犱負(fù)Unicode鍖呭惈鐨勫唴瀹瑰お澶氾紝鍏剁紪鐮佸湪璁$畻鏈轟腑鐨勮〃紺烘柟娉曞氨鎴愪負(fù)浜?jiǎn)涓涓湁蹇呰鐮旂┒鐨勯棶棰樸備紶緇熺紪鐮侊紝姣斿鏍囧噯鐨?浣岮SCII錛屽湪璁$畻鏈轟腑鐨勮〃紺烘柟 娉曞氨鏄崰涓涓瓧鑺傜殑鍚?浣嶏紝榪欎技涔庢槸涓嶉渶瑕佽В閲婂氨絎﹀悎澶у涔?fàn)鎯殑琛ńC烘柟娉曘備絾鏄綋浠奤nicode鐨勬繪暟杈懼埌32浣嶏紙璁$畻鏈虹殑鏈灝忓崟浣嶆槸瀛楄妭錛屾墍浠ュぇ浜? 瀛楄妭錛屽氨鍙兘鑷沖皯鐢?瀛楄妭琛ㄧず錛夛紝瀵逛簬澶ч儴鍒嗗父鐢ㄥ瓧絎︼紝姣斿Unicode緙栫爜鍙崰涓涓瓧鑺傚ぇ灝忕殑鑻辮瀛楁瘝錛屽崰涓や釜瀛楄妭澶у皬姹夊瓧錛岄兘鐢?涓瓧鑺傛潵鍌ㄥ瓨澶ア 渚堜簡(jiǎn)銆傚彟澶栵紝濡傛灉閮界敤4瀛楄妭鐩存帴琛ㄧず錛屽氨涓嶅彲閬垮厤鐨勫嚭鐜頒負(fù)0鐨勫瓧鑺傘傝屾垜浠煡閬擄紝鍦–璇█涓紝0×00鐨勫瓧鑺傚氨鏄?#8217;\0′錛岃〃紺虹殑鏄竴涓瓧絎︿覆錛坈har 瀛楃涓詫紝闈瀢char_t錛夌殑緇撴潫錛屾崲鍙ヨ瘽璇達(dá)紝C椋庢牸鐨刢har瀛楃涓叉棤娉曡〃紺篣nicode銆?br /> 鍥犱負(fù)綾諱技鐨勭縐嶉棶棰橈紝涓篣nicode鍦ㄨ綆楁満涓殑緙栫爜鏂規(guī)硶鍑虹幇浜?jiǎn)锛寴q欏氨鏄疷TF錛涙墍瀵瑰簲鐨勶紝涓篣CS緙栫爜瀹炵幇鐨勬柟寮忎篃鏈夎嚜宸辯殑璇存硶銆備竴鑸潵璇達(dá)紝UTF- x錛寈琛ㄧず榪欏緙栫爜涓涓崟浣嶈嚦灝戝崰鐢▁浣嶏紝鍥犱負(fù)Unicode鏈闀胯揪鍒?2浣嶏紝鎵浠TF-x閫氬父鏄彉闀跨殑——闄や簡(jiǎn)UTF-32錛涜孶CS-y琛ㄧず涓涓崟 浣嶅氨鍗犵敤y涓瓧鑺傦紝鎵浠ヨ兘琛ㄧず褰撲粖Unicode鐨刄CS-y鍙湁UCS-4錛屼絾鏄洜涓哄巻鍙茬殑鍘熷洜錛屽綋Unicode榪樻病閭d箞搴炲ぇ鐨勬椂鍊欙紝2涓瓧鑺傝凍澶熻〃 紺猴紝鎵浠ユ湁UCS-2錛岀幇鍦ㄧ湅鏉ワ紝UCS-2鎵鑳借〃紺虹殑Unicode鍙槸褰撲粖Unicode鐨勪竴涓瓙闆嗐?br /> 涔熷氨鏄錛屽鏋滄煇縐嶇紪鐮侊紝鑳芥牴鎹竴瀹氱殑瑙勫垯綆楁硶錛屽緱鍒癠nicode緙栫爜錛岄偅涔堣繖縐嶇紪鐮佹柟寮忓氨鍙互縐頒箣涓篣TF銆?br /> UTF-8鍜學(xué)indows GB2312
UTF-8鏄竴濂?#8220;鑱槑”鐨勭紪鐮侊紝鍙兘鐢?錛?錛?錛?涓瓧鑺傝〃紺恒傞氳繃UTF-8鐨勭畻娉曪紝姣忎竴涓瓧鑺傝〃紺虹殑淇℃伅閮藉緢鏄庣‘錛氳繖鏄笉鏄煇涓猆nicode緙?鐮佺殑絎竴涓瓧鑺傦紱濡傛灉鏄涓涓瓧鑺傦紝榪欐槸涓涓嚑浣峌nicode緙栫爜銆傝繖縐?#8220;鑱槑”琚О涓篣TF-8鐨勮嚜鎴戝悓姝ワ紝涔熸槸UTF-8鎴愪負(fù)緗戠粶浼犺緭鏍囧噯緙栫爜鐨勫師 鍥犮?br /> 鍙﹀錛孶TF-8涔熶笉浼?xì)鍑虹?瀛楄妭錛屾墍浠ュ彲浠ヨ〃紺轟負(fù)char瀛楃涓詫紝鎵浠ュ彲浠ユ垚涓虹郴緇熺殑緙栫爜銆侺inux緋葷粺榛樿浣跨敤UTF-8緙栫爜銆?br /> Windows GB2312涓鑸嚜縐頒負(fù)GB2312錛屽叾瀹炵湡姝g殑鍚嶅瓧搴旇鏄疻indows Codepage 936錛岃繖涔熸槸涓縐嶅彉闀跨殑緙栫爜錛?涓瓧鑺傝〃紺轟紶緇熺殑ASCII閮ㄥ垎錛涙眽瀛楅儴鍒嗘槸涓や釜瀛楄妭鐨凣BK錛堝浗鏍囨墿錛堝睍錛夛紝鎷奸煶澹版瘝錛夈侰odepage 936涔熷彲浠ヨ〃紺轟負(fù)char瀛楃涓詫紝鏄腑鏂嘩indows緋葷粺鐨勯粯璁ょ紪鐮併?br /> 鎴戜滑鍦ㄧ1鑺備腑鐪嬪埌鐨?br /> const char* s = “涓枃abc”;
鍦╓indows涓殑緙栫爜灝辨槸Codepage 936錛涘湪Linux涓殑緙栫爜灝辨槸UTF-8銆?br /> 闇瑕佹敞鎰忕殑鏄紝Codepage 936涓嶅儚UTF錛岃窡Unicode娌℃湁鎹㈢畻鐨勫叧緋伙紝鎵浠ュ彧鑳介氳繃“浠g爜欏?#8221;鎶鏈煡琛ㄥ搴斻?br /> UTF-16鍜孶CS-2
UTF-16鐢?涓瓧鑺傛垨鑰?涓瓧鑺傝〃紺恒傚湪2涓瓧鑺傚ぇ灝忕殑鏃跺欙紝璺烾CS-2鏄竴鏍風(fēng)殑銆俇TF-16涓嶅儚UTF-8錛屾病鏈夎嚜鎴戝悓姝ユ満鍒訛紝鎵浠ワ紝緙栫爜澶т綅 鍦ㄥ墠榪樻槸灝忎綅鍦ㄥ墠錛屽氨鎴愪簡(jiǎn)瑙佷粊瑙佹櫤鐨勯棶棰樸傛垜浠湪絎?鑺備腑錛?#8220;涓?#8221;鐨刄CS-2BE錛堝洜涓烘槸涓や釜瀛楄妭錛屾墍浠ヤ篃灝辨槸UTF-16BE錛夌紪鐮佹槸0x4E2D錛?榪欓噷鐨凚E灝辨槸澶т綅鍦ㄥ悗鐨勬剰鎬濓紙涔熷氨鏄皬浣嶅湪鍓嶄簡(jiǎn)錛夛紝瀵瑰簲鐨勶紝濡傛灉鏄疷CS-2LE錛岀紪鐮佸氨鎴愪簡(jiǎn)0x2D4E銆?br /> Windows涓殑wchar_t灝辨槸閲囩敤UCS-2BE緙栫爜銆傞渶瑕佹寚鍑虹殑鏄紝C++鏍囧噯涓wchar_t鐨勮姹傛槸瑕佽兘琛ㄧず鎵鏈夌郴緇熻兘璇嗗埆鐨勫瓧絎︺俉indows鑷О鏀寔Unicode錛屼絾鏄叾wchar_t鍗翠笉鑳借〃紺烘墍鏈夌殑Unicode錛岀敱姝よ繚鑳屼簡(jiǎn)C++鏍囧噯銆?br /> UTF-32鍜孶CS-4
UTF-32鍦ㄧ洰鍓嶉樁孌電瓑浠蜂簬UCS-4錛岄兘鐢ㄥ畾闀跨殑4涓瓧鑺傝〃紺恒俇TF-32鍚屾牱瀛樺湪BE鍜孡E鐨勯棶棰樸侺inux鐨剋char_t緙栫爜灝辨槸UTF- 32BE銆傚湪16浣嶄互鍐呯殑鏃跺欙紝UTF-32BE鐨勫悗涓や綅錛堝墠涓や綅鏄?×00 0×00錛夌瓑浠蜂簬UTF-16BE涔熷氨絳変環(huán)浜嶶CS-2BE
BOM
涓轟簡(jiǎn)璇存槑涓涓枃浠墮噰鐢ㄧ殑鏄粈涔堢紪鐮侊紝鍦ㄦ枃浠舵渶寮濮嬬殑閮ㄥ垎錛屽彲浠ユ湁BOM錛屾瘮濡?xFE 0xFF琛ㄧずUTF-16BE錛?xFF 0xFE 0×00 0×00琛ㄧずUTF-32LE銆俇TF-8鍘熸湰鏄笉闇瑕丅OM鐨勶紝鍥犱負(fù)鍏惰嚜鎴戝悓姝ョ殑鐗規(guī)э紝浣嗘槸涓轟簡(jiǎn)鏄庣‘璇存槑榪欐槸UTF-8錛堣屼笉鏄鏂囨湰緙栬緫鍣ㄥ幓鐚滐級(jí)錛屼篃 鍙互鍔犱笂UTF-8鐨凚OM錛?xEF 0xBB 0xBF
浠ヤ笂鍐呭閮借榪板緱寰堟鐣ワ紝璇︾粏淇℃伅璇鋒煡闃呯淮鍩虹櫨縐戠浉鍏沖唴瀹廣?/p>

std::locale
閫氳繃鍓嶉潰涓よ妭鐨勭煡璇嗭紝鎴戜滑鐭ラ亾浜?jiǎn)鍦–/C++涓紝瀛楃錛堜覆錛夊拰瀹藉瓧絎︼紙涓詫級(jí)涔嬮棿鐨勮漿鎹笉鏄畝鍗曠殑錛屽浐瀹氱殑鏁板鍏崇郴錛屽紿勮漿鎹緷璧栦簬鏈湴鍖栫瓥鐣ラ泦 錛坙ocale錛夈傛崲鍙ヨ瘽璇達(dá)紝涓涓▼搴忓湪榪愯涔嬪墠騫朵笉鐭ラ亾緋葷粺鐨勬湰鍦板寲絳栫暐闆嗘槸浠涔堬紝紼嬪簭鍙湁鍦ㄨ繍琛屼箣鍚庢墠閫氳繃locale鑾峰緱褰撴椂鐨勬湰鍦板寲絳栫暐闆嗐?br /> C鏈夎嚜宸辯殑locale鍑芥暟錛屾垜浠繖閲岀洿鎺ヤ粙緇岰++鐨刲ocale綾匯?br /> 鍏堣璁簂ocale鐨勬瀯閫犲嚱鏁幫細(xì)
locale() throw();
榪欎釜鏋勯犲嚱鏁版槸鑾峰緱褰撳墠紼嬪簭鐨刲ocale錛岀敤娉曞涓嬶細(xì)
std::locale app_loc = std::locale();
鎴栬咃紙榪欐槸鏋勯犲璞$殑涓ょ琛ㄧず鏂瑰紡錛屽悗鍚岋級(jí)
std::locale app_loc;
鍙﹀涓涓瀯閫犲嚱鏁版槸錛?br /> explicit locale(const char* name);
榪欎釜鏋勯犲嚱鏁頒互name鐨勫悕瀛楀垱寤烘柊鐨刲ocale銆傞噸瑕佺殑locale瀵硅薄鏈夛細(xì)
std::locale sys_loc(“”);      //鑾峰緱褰撳墠緋葷粺鐜鐨刲ocale
std::locale C_loc(“C”);      鎴栬?nbsp;     std::locale C_loc = std::locale::classic();      //鑾峰緱C瀹氫箟locale
std::locale old_loc = std::locale::global(new_loc);      //灝唍ew_loc璁劇疆涓哄綋鍓嶅叏灞locale錛屽茍灝嗗師鏉ョ殑locale榪斿洖緇檕ld_loc
闄や簡(jiǎn)榪欎簺錛屽叾瀹冪殑name鍏蜂綋鍚嶅瓧渚濊禆浜嶤++緙栬瘧鍣ㄥ拰鎿嶄綔緋葷粺錛屾瘮濡侺inux涓媑cc涓枃緋葷粺鐨刲ocale鍚嶅瓧涓?#8221;zh_CN.UTF-8″錛屼腑鏂嘩indows鍙互鐢?#8221;chs”錛堟洿鍔犲畬鏁寸殑鍚嶅瓧鍙互鐢╪ame()鍑芥暟鏌ョ湅錛夈?br /> mbstowcs()鍜寃cstombs()
榪欎袱涓狢榪愯鏃跺簱鍑芥暟渚濊禆浜庡叏灞locale榪涜杞崲錛屾墍浠ワ紝浣跨敤鍓嶅繀欏誨厛璁劇疆鍏ㄥ眬locale銆?br /> std::locale宸茬粡鍖呭惈鍦?lt;iostream>涓簡(jiǎn)錛屽啀鍔犱笂鎴戜滑闇瑕佺敤鍒扮殑C++瀛楃涓詫紝鎵浠ュ寘鍚?lt;string>銆?br /> 鎴戜滑鍏堢湅紿勫埌瀹界殑杞崲鍑芥暟錛?/p>

  1. const std::wstring s2ws(const std::string& s)   
  2. {   
  3.     std::locale old_loc = std::locale::global(std::locale(""));   
  4.     const char* src_str = s.c_str();   
  5.     const size_t buffer_size = s.size() + 1;   
  6.     wchar_t* dst_wstr = new wchar_t[buffer_size];   
  7.     wmemset(dst_wstr, 0, buffer_size);   
  8.     mbstowcs(dst_wstr, src_str, buffer_size);   
  9.     std::wstring result = dst_wstr;   
  10.     delete []dst_wstr;   
  11.     std::locale::global(old_loc);   
  12.     return result;   
  13. }  
  14.  

鎴戜滑灝嗗叏灞locale璁劇疆涓虹郴緇焞ocale錛屽茍淇濆瓨鍘熸潵鐨勫叏灞locale鍦╫ld_loc涓?br /> 鍦ㄥ埗瀹氳漿鎹㈢┖闂寸紦瀛樺ぇ灝忕殑鏃跺欙紝鑰冭檻濡備笅錛歝har鏄敤1涓垨澶氫釜瀵硅薄錛屼篃灝辨槸1涓垨鑰呭涓瓧鑺傛潵琛ㄧず鍚勭絎﹀彿錛氭瘮濡傦紝GB2312鐢?涓瓧鑺傝〃紺烘暟瀛楀拰 瀛楁瘝錛?涓瓧鑺傝〃紺烘眽瀛楋紱UTF-8鐢ㄤ竴涓瓧鑺傝〃紺烘暟瀛楀拰瀛楁瘝錛?涓瓧鑺傝〃紺烘眽瀛楋紝4涓瓧鑺傝〃紺轟竴浜涘緢灝戠敤鍒扮殑絎﹀彿錛屾瘮濡傞煶涔愪腑G澶ц皟絎﹀彿絳夈?wchar_t鏄敤1涓璞★紙2瀛楄妭鎴栬?瀛楄妭錛夋潵琛ㄧず鍚勭絎﹀彿銆傚洜姝わ紝琛ㄧず鍚屾牱鐨勫瓧絎︿覆錛屽瀛楃涓茬殑澶у皬錛堜篃灝辨槸wchar_t瀵硅薄鐨勬暟閲忥級(jí)鎬繪槸灝忎簬鎴?鑰呯瓑浜庣獎(jiǎng)瀛楃涓插ぇ灝忥紙char瀵硅薄鏁伴噺錛夌殑銆?1鏄負(fù)浜?jiǎn)鍦ㄦ渶鍚庨鐣欎竴涓間負(fù)0鐨勫璞★紝浠ヤ究璁〤椋庢牸鐨刢har鎴栬厀char_t瀛楃涓茶嚜鍔ㄦ埅鏂?#8212;—榪欏綋鐒?鏄涓插ぇ灝忕瓑浜庣獎(jiǎng)涓插ぇ灝忕殑鏃跺欐墠浼?xì)鐢ㄤ笂鐨勫Q屽ぇ閮ㄥ垎鏃跺欙紝瀛楃涓叉棭鍦ㄥ墠闈㈡煇涓漿鎹㈠畬姣曠殑浣嶇疆灝辮0鍊煎璞℃墍鎴柇浜?jiǎn)銆?br /> 鏈鍚庢垜浠皢鍏ㄥ眬locale璁劇疆鍥炲師鏉ョ殑old_loc銆?br /> 紿勪覆鍒板涓茬殑杞崲鍑芥暟錛?/p>

  1. const std::string ws2s(const std::wstring& ws)   
  2. {   
  3.     std::locale old_loc = std::locale::global(std::locale(""));   
  4.     const wchar_t* src_wstr = ws.c_str();   
  5.     size_t buffer_size = ws.size() * 4 + 1;   
  6.     char* dst_str = new char[buffer_size];   
  7.     memset(dst_str, 0, buffer_size);   
  8.     wcstombs(dst_str ,src_wstr, buffer_size);   
  9.     std::string result = dst_str;   
  10.     delete []dst_str;   
  11.     std::locale::global(old_loc);   
  12.     return result;   
  13. }  
  14.  

榪欓噷鑰冭檻杞崲絀洪棿緙撳瓨澶у皬鐨勭瓥鐣ユ濂界浉鍙嶏紝鍦ㄦ渶鏋佺鐨勬儏鍐典笅錛屾墍鏈夌殑wchar_t閮介渶瑕?涓猚har鏉ヨ〃紺猴紝鎵浠ユ渶澶х殑鍙兘灝辨槸4鍊嶅姞1銆?br /> 榪欎袱涓嚱鏁板湪VC鍜実cc涓兘鑳芥甯歌繍琛岋紙MinGW鍥犱負(fù)鍓嶉潰璇村埌鐨勫師鍥犱笉鏀寔瀹藉瓧絎︾殑姝e父浣跨敤錛夛紝鍦╒C涓細(xì)緇欏嚭涓嶅畨鍏ㄧ殑璀﹀憡錛岃繖鏄憡璇夌粰閭d簺寮勪笉娓呭紿勮漿鎹㈠疄璐ㄧ殑浜虹殑璀﹀憡錛屽浜庝簡(jiǎn)瑙e埌鐩墠榪欎簺鐭ヨ瘑鐨勪綘鎴戞潵璇達(dá)紝榪欏氨鏄暟鍡︿簡(jiǎn)銆?/p>

locale鍜宖acet
C++鐨刲ocale妗嗘灦姣擟鏇村畬澶囥侰++闄や簡(jiǎn)涓涓緇熸湰鍦扮瓥鐣ラ泦locale錛岃繕鍙互涓簂ocale鎸囧畾鍏蜂綋鐨勭瓥鐣acet錛岀敋鑷沖彲浠ョ敤鑷繁瀹氫箟鐨?facet鍘繪敼閫犱竴涓幇鏈夌殑locale浜х敓涓涓柊鐨刲ocale銆傚鏋滄湁涓涓猣acet綾籒ewFacet闇瑕佹坊鍔犲埌鏌愪釜old_loc涓艦鎴愭柊 new_loc錛岄渶瑕佸彟澶栦竴涓瀯閫犲嚱鏁幫紝閫氬父鐨勫仛娉曟槸錛?br /> std::locale new_loc(old_loc, new NewFacet);
鏍囧噯搴撻噷鐨勬爣鍑唂acet閮藉叿鏈夎嚜宸辯壒鏈夌殑鍔熻兘錛岃闂竴涓猯ocale瀵硅薄涓壒瀹氱殑facet闇瑕佷嬌鐢ㄦā鏉垮嚱鏁皍se_facet錛?br /> template <class Facet> const Facet& use_factet(const locale&);
鎹竴縐嶈娉曪紝use_facet鎶婁竴涓猣acet綾誨疄渚嬪寲鎴愪簡(jiǎn)瀵硅薄錛岀敱姝ゅ氨鍙互浣跨敤榪欎釜facet瀵硅薄鐨勬垚鍛樺嚱鏁般?br /> codecvt
codecvt灝辨槸涓涓爣鍑唂acet銆傚湪C++鐨勮璁℃鏋墮噷錛岃繖鏄竴涓氱敤鐨勪唬鐮佽漿鎹㈡ā鏉?#8212;—涔熷氨鏄錛屽茍涓嶆槸浠呬粎涓哄紿勮漿鎹㈠埗瀹氱殑銆?br /> templat <class I, class E, class State> class std::codecvt: public locale, public codecvt_base{…};
I琛ㄧず鍐呴儴緙栫爜錛孍琛ㄧず澶栭儴緙栫爜錛孲tate鏄笉鍚岃漿鎹㈡柟寮忕殑鏍囪瘑錛屽鏋滃畾涔夊涓嬬被鍨嬶細(xì)
typedef std::codecvt<wchar_t, char, mbstate_t> CodecvtFacet;
閭d箞CodecvtFacet灝辨槸涓涓爣鍑嗙殑瀹界獎(jiǎng)杞崲facet錛屽叾涓璵bstate_t鏄爣鍑嗗紿勮漿鎹㈢殑State銆?br /> 鍐呴儴緙栫爜鍜屽閮ㄧ紪鐮?br /> 鎴戜滑鑰冭檻絎?鑺備腑鎻愬埌鐨凜++緙栬瘧鍣ㄨ鍙栨簮鏂囦歡鏃跺欑殑鎯呭艦錛屽綋璇誨埌L”涓枃abc”鐨勬椂鍊欙紝澶栭儴緙栫爜錛屼篃灝辨槸婧愭枃浠剁殑緙栫爜錛屾槸GB2312鎴栬匲TF-8 鐨刢har錛岃岀紪璇戝櫒蹇呴』灝嗗叾緲昏瘧涓篣CS-2BE鎴栬匲TF-32BE鐨剋char_t錛岃繖涔熷氨鏄▼搴忕殑鍐呴儴緙栫爜銆傚鏋滀笉鏄瀛楃涓詫紝鍐呭緙栫爜閮芥槸 char錛屼篃灝變笉闇瑕佽漿鎹簡(jiǎn)銆傜被浼肩殑錛屽綋C++璇誨啓鏂囦歡鐨勬椂鍊? 錛屽氨浼?xì)鍙兘闇瑕佸埌鍐呭緙栫爜杞崲銆備簨瀹炰笂錛宑odecvt灝辨鏄鏂囦歡嫻佺紦瀛榖asic_filebuf鎵浣跨敤鐨勩傜悊瑙h繖涓鐐瑰緢閲嶈錛屽師鍥犱細(xì)鍦ㄤ笅涓灝忚妭鐪?鍒般?br /> CodecvtFacet鐨刬n()鍜宱ut()
鍥犱負(fù)鍦–odecvtFacet涓紝鍐呴儴緙栫爜璁劇疆涓簑char_t錛屽閮ㄧ紪鐮佽緗負(fù)char錛岃漿鎹㈡ā寮忔槸鏍囧噯瀹界獎(jiǎng)杞崲mbstate_t錛屾墍浠ワ紝綾繪柟娉?in()灝辨槸浠巆har鏍囧噯杞崲鍒皐char_t錛宱ut()灝辨槸浠巜char_t鏍囧噯杞崲鍒癱har銆傝繖灝辨垚浜?jiǎn)鎴戜滑姝i渶瑕佺殑鍐呭杞崲鍑芥暟銆?br /> result in(State& s, const E* from, const E* from_end, const E*& from_next, I* to,  I* to_end, I*& to_next) const;
result out(State& s, const I* from, const I* from_end, const I*& from_next, E* to, E* to_end, E*& to_next) const;
鍏朵腑錛宻鏄潪const寮曠敤錛屼繚瀛樼潃杞崲浣嶇Щ鐘舵佷俊鎭傝繖閲岄渶瑕侀噸鐐瑰己璋冪殑鏄紝鍥犱負(fù)杞崲鐨勫疄闄呭伐浣滀氦緇欎簡(jiǎn)榪愯鏃跺簱錛屼篃灝辨槸璇達(dá)紝杞崲鍙兘涓嶆槸鍦ㄧ▼搴忕殑涓昏繘紼?涓畬鎴愮殑錛岃岃漿鎹㈠伐浣滀緷璧栦簬鏌ヨs鐨勫鹼紝鍥犳錛屽鏋渟鍦ㄨ漿鎹㈢粨鏉熷墠鏋愭瀯錛屽氨鍙兘鎶涘嚭榪愯鏃跺紓甯搞傛墍浠ワ紝鏈瀹夊叏鐨勫姙娉曟槸錛屽皢s璁劇疆涓哄叏灞鍙橀噺錛?br /> const鐨?涓寚閽堝垎鍒槸寰呰漿鎹㈠瓧絎︿覆鐨勮搗鐐癸紝緇堢偣錛屽拰鍑虹幇閿欒鏃跺欑殑鍋滅偣錛堢殑涓嬩竴涓綅緗級(jí)錛涘彟澶?涓寚閽堟槸杞崲鐩爣瀛楃涓茬殑璧風(fēng)偣錛岀粓鐐逛互鍙?qiáng)鍑虹幇閿欒鏃跺欑殑鍋滅偣錛堢殑涓嬩竴涓綅緗級(jí)銆?br /> 浠g爜濡備笅錛?br /> 澶存枃浠訛細(xì)

  1. //Filename string_wstring_cppcvt.hpp   
  2. #ifndef STRING_WSTRING_CPPCVT_HPP   
  3. #define STRING_WSTRING_CPPCVT_HPP   
  4. #include <iostream>   
  5. #include <string>   
  6. const std::wstring s2ws(const std::string& s);   
  7. const std::string ws2s(const std::wstring& s);   
  8. #endif  
  9.  

瀹炵幇錛?/p>

  1. #include "string_wstring_cppcvt.hpp"   
  2. mbstate_t in_cvt_state;   
  3. mbstate_t out_cvt_state;   
  4. const std::wstring s2ws(const std::string& s)   
  5. {   
  6.     std::locale sys_loc("");   
  7.     const char* src_str = s.c_str();   
  8.     const size_t BUFFER_SIZE = s.size() + 1;   
  9.     wchar_t* intern_buffer = new wchar_t[BUFFER_SIZE];   
  10.     wmemset(intern_buffer, 0, BUFFER_SIZE);   
  11.     const char* extern_from = src_str;   
  12.     const char* extern_from_end = extern_from + s.size();   
  13.     const char* extern_from_next = 0;   
  14.     wchar_t* intern_to = intern_buffer;   
  15.     wchar_t* intern_to_end = intern_to + BUFFER_SIZE;   
  16.     wchar_t* intern_to_next = 0;   
  17.     typedef std::codecvt<wchar_t, char, mbstate_t> CodecvtFacet;   
  18.     CodecvtFacet::result cvt_rst =   
  19.     std::use_facet<CodecvtFacet>(sys_loc).in(   
  20.             in_cvt_state,   
  21.             extern_from, extern_from_end, extern_from_next,   
  22.             intern_to, intern_to_end, intern_to_next);   
  23.     if (cvt_rst != CodecvtFacet::ok) {   
  24.         switch(cvt_rst) {   
  25.         case CodecvtFacet::partial:   
  26.                 std::cerr << "partial";   
  27.                 break;   
  28.         case CodecvtFacet::error:   
  29.                 std::cerr << "error";   
  30.                 break;   
  31.         case CodecvtFacet::noconv:   
  32.                 std::cerr << "noconv";   
  33.                 break;   
  34.         default:   
  35.                 std::cerr << "unknown";   
  36.         }   
  37.         std::cerr  << ", please check in_cvt_state."   
  38. << std::endl;   
  39.     }   
  40.     std::wstring result = intern_buffer;   
  41.     delete []intern_buffer;   
  42.     return result;   
  43. }   
  44. const std::string ws2s(const std::wstring& ws)   
  45. {   
  46.     std::locale sys_loc("");   
  47.     const wchar_t* src_wstr = ws.c_str();   
  48.     const size_t MAX_UNICODE_BYTES = 4;   
  49.     const size_t BUFFER_SIZE =   
  50.                 ws.size() * MAX_UNICODE_BYTES + 1;   
  51.     char* extern_buffer = new char[BUFFER_SIZE];   
  52.     memset(extern_buffer, 0, BUFFER_SIZE);   
  53.     const wchar_t* intern_from = src_wstr;   
  54.     const wchar_t* intern_from_end = intern_from + ws.size();   
  55.     const wchar_t* intern_from_next = 0;   
  56.     char* extern_to = extern_buffer;   
  57.     char* extern_to_end = extern_to + BUFFER_SIZE;   
  58.     char* extern_to_next = 0;   
  59.     typedef std::codecvt&lt;wchar_t, char, mbstate_t> CodecvtFacet;   
  60.     CodecvtFacet::result cvt_rst =   
  61.     std::use_facet<CodecvtFacet>(sys_loc).out(   
  62.             out_cvt_state,   
  63.             intern_from, intern_from_end, intern_from_next,   
  64.             extern_to, extern_to_end, extern_to_next);   
  65.     if (cvt_rst != CodecvtFacet::ok) {   
  66.         switch(cvt_rst) {   
  67.         case CodecvtFacet::partial:   
  68.                 std::cerr << "partial";   
  69.                 break;   
  70.         case CodecvtFacet::error:   
  71.                 std::cerr << "error";   
  72.                 break;   
  73.         case CodecvtFacet::noconv:   
  74.                 std::cerr << "noconv";   
  75.                 break;   
  76.         default:   
  77.                 std::cerr << "unknown";   
  78.         }   
  79.         std::cerr << ", please check out_cvt_state."   
  80. << std::endl;   
  81.     }   
  82.     std::string result = extern_buffer;   
  83.     delete []extern_buffer;   
  84.     return result;   
  85. }  
  86.  

鏈鍚庤ˉ鍏呰鏄庝竴涓媠td::use_facet&lt;CodecvtFacet>(sys_loc).in()鍜?std::use_facet<CodecvtFacet>(sys_loc).out()銆俿ys_loc鏄郴緇熺殑locale錛岃繖涓?locale涓氨鍖呭惈鐫鐗瑰畾鐨刢odecvt facet錛屾垜浠凡緇弔ypedef涓轟簡(jiǎn)CodecvtFacet銆傜敤use_facet瀵笴odecvtFacet榪涜浜?jiǎn)瀹炰緥鍖栧Q屾墍浠ュ彲浠ヤ嬌鐢ㄨ繖涓?facet鐨勬柟娉昳n()鍜宱ut()銆?/p>

C++鐨勬祦鍜屾湰鍦板寲絳栫暐闆?br /> BS鍦ㄨ璁++嫻佺殑鏃跺欏笇鏈涘叾鍏峰鏅鴻兘鍖栵紝騫朵笖鏄彲鎵╁睍鐨勬櫤鑳藉寲錛屼篃灝辨槸璇達(dá)紝C++鐨勬祦鍙互“璇繪噦”涓浜涘唴瀹廣傛瘮濡傦細(xì)

std::cout <&lt; 123 &lt;&lt; “ok” &lt;&lt; std::endl;

榪欏彞浠g爜涓紝std::cout鏄兘鍒ゆ柇鍑?23鏄痠nt鑰?#8221;ok”鏄痗onst char[3]銆傚埄鐢ㄦ祦鐨勬櫤鑳斤紝鐢氳嚦鍙互鍋氫竴浜涘熀紜綾誨瀷鐨勮漿鎹紝姣斿浠巌nt鍒皊tring錛宻tring鍒癷nt錛?/p>

  1. std::string str("123");   
  2. std::stringstream sstr(str);   
  3. int i;   
  4. sstr >&gt; i;  
  5.  
  6. int i = 123;   
  7. std::stringstream sstr;   
  8. sstr <&lt; i;   
  9. std::string str = sstr.str();  
  10.  

灝界濡傛錛孋++騫朵笉婊¤凍錛孋++鐢氳嚦甯屾湜嫻佽兘“鏄庣櫧”鏃墮棿錛岃揣甯佺殑琛ㄧず娉曘傝屾椂闂村拰璐у竵鐨勮〃紺烘柟娉曞湪涓栫晫鑼冨洿鍐呮槸涓嶅悓鐨勶紝鎵浠ワ紝姣忎竴涓祦閮芥湁鑷繁 鐨刲ocale鍦ㄥ獎(jiǎng)鍝嶅叾琛屼負(fù)錛孋++涓彨鍋氭縺媧伙紙imbue錛屼篃鏈夌炕璇戞垚嫻告煋錛夈傝屾垜浠煡閬擄紝姣忎竴涓猯ocale閮芥湁澶氫釜facet錛岃繖浜沠acet騫墮潪 鎬繪槸琚玼se_facet浣跨敤鐨勩傚喅瀹氫嬌鐢ㄥ摢浜沠acet鐨勶紝鏄祦鐨勭紦瀛榖asic_streambuf鍙?qiáng)鍏秼z劇敓綾籦asic_stringbuf鍜?basic_filebuf銆傛垜浠鐢ㄥ埌鐨刦acet鏄痗odecvt錛岃繖涓猣acet鍙basic_filebuf浣跨敤——榪欏氨鏄負(fù)浠涔堝彧鑳界敤 fstream鏉ュ疄鐜板紿勮漿鎹紝鑰屾棤娉曚嬌鐢╯stream鏉ュ疄鐜扮殑鍘熷洜銆?br /> 澶存枃浠訛細(xì)

  1. //filename string_wstring_fstream.hpp   
  2. #ifndef STRING_WSTRING_FSTREAM_HPP   
  3. #define STRING_WSTRING_FSTREAM_HPP   
  4. #include &lt;string>   
  5. const std::wstring s2ws(const std::string& s);   
  6. const std::string ws2s(const std::wstring& s);   
  7. #endif 

瀹炵幇錛?/p>

  1. #include <string>   
  2. #include <fstream>   
  3. #include "string_wstring_fstream.hpp"   
  4. const std::wstring s2ws(const std::string& s)   
  5. {   
  6.     std::locale sys_loc("");   
  7.     std::ofstream ofs("cvt_buf");   
  8.     ofs <&lt; s;   
  9.     ofs.close();   
  10.     std::wifstream wifs("cvt_buf");   
  11.     wifs.imbue(sys_loc);   
  12.     std::wstring wstr;   
  13.     wifs >&gt; wstr;   
  14.     wifs.close();   
  15.     return wstr;   
  16. }   
  17. const std::string ws2s(const std::wstring& s)   
  18. {   
  19.     std::locale sys_loc("");   
  20.     std::wofstream wofs("cvt_buf");   
  21.     wofs.imbue(sys_loc);   
  22.     wofs <&lt; s;   
  23.     wofs.close();   
  24.     std::ifstream ifs("cvt_buf");   
  25.     std::string str;   
  26.     ifs >&gt; str;   
  27.     ifs.close();   
  28.     return str;   
  29. }  
  30.  

鍦ㄧ獎(jiǎng)鍒板鐨勮漿鍖栦腑錛屾垜浠厛浣跨敤榛樿鐨勬湰鍦板寲絳栫暐闆嗭紙locale錛夊皢s閫氳繃紿勬枃浠舵祦ofs浼犲叆鏂囦歡錛岃繖鏄痗har鍒癱har鐨勪紶閫掞紝娌℃湁浠諱綍杞崲錛?鐒跺悗鎴戜滑鎵撳紑瀹芥枃浠舵祦wifs錛屽茍鐢ㄧ郴緇熺殑鏈湴鍖栫瓥鐣ラ泦錛坙ocale錛夊幓嬋媧伙紙imbue錛変箣錛屾祦鍦ㄨ鍥炲涓瞱str鐨勬椂鍊欙紝灝辨槸char鍒?wchar_t鐨勮漿鎹紝騫朵笖鍥犱負(fù)嬋媧諱簡(jiǎn)sys_loc錛屾墍浠ュ疄鐜版爣鍑嗙獎(jiǎng)鍒板鐨勮漿鎹€?br /> 鍦ㄥ鍒扮獎(jiǎng)鐨勮漿鍖栦腑錛屾垜浠厛鎵撳紑鐨勬槸瀹芥枃浠舵祦wofs錛屽茍涓旂敤緋葷粺鐨勬湰鍦板寲絳栫暐闆唖ys_loc嬋媧伙紙imbue錛変箣錛岃繖鏃跺欙紝鍥犱負(fù)瑕佸啓鐨勬枃浠?cvt_buf鏄竴涓閮ㄧ紪鐮侊紝鎵浠ユ墽琛屼簡(jiǎn)浠巜char_t鍒癱har鐨勬爣鍑嗚漿鎹€傝鍥炴潵鐨勬枃浠舵祦浠巆har鍒癱har錛屼笉鍋氫換浣曡漿鎹€?/p>

紜紪鐮佺殑紜激
鎴戜滑鐜板湪鐭ラ亾錛孋/C++鐨勫紿勮漿鎹㈡槸渚濊禆緋葷粺鐨刲ocale鐨勶紝騫朵笖鍦ㄨ繍琛屾椂瀹屾垚銆傝冭檻榪欐牱涓縐嶆儏鍐碉紝鎴戜滑鍦ㄧ畝浣撲腑鏂嘩indows涓嬬紪璇戝涓嬭鍙ワ細(xì)
const char* s = “涓枃abc”;
鏍規(guī)嵁鎴戜滑涔嬪墠鐨勮璁猴紝緙栬瘧鍣ㄥ皢鎸夌収Windows Codepage936錛圙B2312錛夊榪欎釜瀛楃涓茶繘琛岀紪鐮併傚鏋滄垜浠湪紼嬪簭涓繍琛屽紿勮漿鎹㈠嚱鏁幫紝灝唖杞崲涓哄瀛楃涓瞱s錛屽鏋滆繖涓▼搴忚繍琛屽湪綆浣撲腑鏂?鐜涓嬫槸娌¢棶棰樼殑錛屽皢鎵ц浠嶨B2312鍒癠CS-2BE鐨勮漿鎹紱浣嗘槸錛屽鏋滃湪鍏朵粬璇█鐜涓嬶紝姣斿鏄箒浣撲腑鏂嘊IG5錛岀▼搴忓皢鏍規(guī)嵁緋葷粺鐨刲ocale鎵?琛屼粠BIG5鍒癠CS-2BE鐨勮漿鎹紝榪欐樉鐒跺氨鍑虹幇浜?jiǎn)閿欒銆?br /> 琛ユ晳
鏈夋病鏈夎ˉ鏁戣繖涓棶棰樼殑鍔炴硶鍛紵涓涓В鍐蟲柟妗堝氨鏄墽琛屼笉渚濊禆locale鐨勫紿勮漿鎹€傚疄闄呬笂錛岃繖灝卞凡緇忎笉鏄紿勮漿鎹箣闂寸殑闂?shù)簡(jiǎn)锛岃屾槸緙栫爜涔嬮棿杞崲鐨勯棶棰?浜?jiǎn)銆傛垜浠彲浠ョ敤GNU鐨刲ibiconv瀹炵幇浠繪剰緙栫爜闂寸殑杞崲錛屽浜庝互涓婄殑鍏蜂綋鎯呭喌錛屾寚鏄庢槸浠嶨B2312鍒癠CS-2BE灝變笉浼?xì)鍑洪敊銆傦紙璇峰弬鑰冩湰浜哄墠闈?鐨勭珷鑺傦細(xì)win32涓嬬殑libiconv錛夛紝浣嗚繖鏄劇劧鏄竴涓鎷欑殑絳栫暐錛氭垜浠湪綆浣撲腑鏂嘩indows涓嬪繀欏諱嬌鐢℅B2312鍒癠CS-2BE鐗堟湰鐨勫紿勮漿鎹㈠嚱鏁幫紱鍒頒簡(jiǎn)BIG5鐜涓嬶紝灝卞繀欏婚噸鏂板啓浠嶣IG5鍒癠CS-2BE鐨勫紿勮漿鎹㈠嚱鏁般?br /> Windows鐨勭瓥鐣?br /> Windows鐨勭瓥鐣ユ槸娣樻卑浜?jiǎn)绐?jiǎng)瀛楃涓詫紝騫茶剢鍙敤瀹藉瓧絎︿覆銆傛墍鏈夌殑紜紪鐮佸叏閮ㄥ姞涓婄壒瀹氬畯錛屾瘮濡俆EXT()錛屽鏋滅▼搴忔槸鎵璋揢nicode緙栬瘧錛屽湪緙栬瘧鏃跺氨緲昏瘧涓篣CS2-BE——Windows鑷О涓篣nicode緙栫▼錛屽叾鏈川鏄嬌鐢ㄤ簡(jiǎn)UCS-2BE鐨?6浣嶅瀛楃涓層?br /> Linux鐨勭瓥鐣?br /> Linux涓嬫牴鏈氨涓嶅瓨鍦ㄨ繖涓棶棰橈紒鍥犱負(fù)鍚勭璇█鐨凩inux閮戒嬌鐢║TF-8鐨勭紪鐮侊紝鎵浠ワ紝鏃犺緋葷粺locale濡備綍鍙樺寲錛岀獎(jiǎng)鍒板杞崲鐨勮鍒欎竴鐩存槸UTF-8鍒癠TF32-BE 銆?br /> 璺ㄥ鉤鍙扮瓥鐣?br /> 鍥犱負(fù)鍦?6浣嶇殑鑼冨洿鍐咃紝UTF32-BE鐨勫墠16浣嶄負(fù)0錛屽悗16浣嶄笌UCS2-BE鏄竴鏍風(fēng)殑錛屾墍浠ワ紝鍗充嬌wchar_t鐨剆izeof()涓嶄竴鏍鳳紝鍦ㄤ竴鑸儏鍐典笅錛岃法騫沖彴浣跨敤瀹藉瓧絎︼紙涓詫級(jí)涔熷簲璇ユ槸鍏煎鐨勩備絾鏄緷鐒跺瓨鍦ㄦ綔鍦ㄧ殑闂錛屽氨鏄偅浜?瀛楄妭鐨刄TF32緙栫爜銆?br /> gettext絳栫暐
浠ヤ笂閮芥槸灝咥SCII鍙?qiáng)浠ュ鐨劸~栫爜紜紪鐮佸湪紼嬪簭涓殑鍔炴硶銆侴NU鐨刧ettext鎻愪緵浜?jiǎn)鍙﹀涓縐嶉夋嫨錛氬湪紼嬪簭涓彧紜紪鐮丄SCII錛屽璇█鏀寔鐢眊ettext鍑芥暟搴撳湪榪愯鏃跺姞杞姐傦紙瀵筭ettext鐨勪粙緇嶈鍙傝冩湰浜哄墠闈㈢殑绔犺妭錛?a href="../../lf426/archive/2008/03/30/45723.html" target="\"_blank\"">Win32涓嬬殑GetText錛夈?gettext鐨勫璇█緲昏瘧鏂囦歡涓嶅湪紼嬪簭涓紝鑰屾槸鍗曠嫭鐨勬彁鍑烘潵鏀懼湪鐗瑰畾鐨勪綅緗俫ettext鏄庣‘鐨勭煡閬撹繖浜涚炕璇戞枃浠剁殑緙栫爜錛屾墍浠ュ彲浠ュ噯紜殑鍛婅瘔緇欑郴緇熺炕 璇戠殑姝g‘淇℃伅錛岃岀郴緇熷皢榪欎簺淇℃伅浠ュ綋鍓嶇殑緋葷粺locale緙栫爜鎴愮獎(jiǎng)瀛楃涓插弽棣堢粰紼嬪簭銆備緥濡傦紝鍦ㄧ畝浣撲腑鏂嘩indows涓紝gettext鐨刾o鏂囦歡涔熷彲浠?浠TF-8鍌ㄥ瓨錛実ettext灝唒o鏂囦歡緲昏瘧鎴恗o鏂囦歡錛岀‘淇漨o鏂囦歡鍦ㄤ換浣曠郴緇熷拰璇█鐜涓嬮兘鑳藉姝g‘緲昏瘧銆傚湪榪愯鏄紶緇檞in32紼嬪簭鐨勭獎(jiǎng)涓茬鍚?褰撳墠locale錛屾槸GB2312銆俫ettext璁╁浗闄呭寲鐨勭炕璇戞洿鍔犵殑鏂逛究錛岀己鐐規(guī)槸鐩墠鎴戞病鎵懼埌鏀寔瀹藉瓧絎︿覆鐨勭増鏈紙鎹鏄湁ugettext()鏀寔 瀹藉瓧絎︿覆錛夛紝鎵浠ヨ浣跨敤gettext鍙兘浣跨敤紿勫瓧絎︿覆銆備絾鏄痝ettext鍙互杞崲鍒板瀛楃涓詫紝鑰屼笖涓嶄細(xì)鍑虹幇瀹界獎(jiǎng)杞崲鐨勯棶棰橈紝鍥犱負(fù)gettext鏄繍琛?鏃舵牴鎹甽ocale緲昏瘧鐨勩備緥濡傦細(xì)
const char* s = gettext(“Chinese a b c”);
鍏朵腑”Chinese a b c”鍦╬o涓殑緲昏瘧鏄?#8221;涓枃abc”
浣跨敤渚濊禆locale鐨勮繍琛屾椂瀹界獎(jiǎng)杞崲鍑芥暟錛?br /> const std::wstring wstr = s2ws(s);
榪愯鏃惰皟鐢ㄨpo鏂囦歡瀵瑰簲鐨刴o鏂囦歡錛屽湪綆浣撲腑鏂囩幆澧冧笅灝變互GB2312浼犵粰紼嬪簭錛屽湪綣佷綋涓枃涓氨浠IG5浼犵粰紼嬪簭錛岃繖鏍穝2ws()鎬昏兘澶熸甯告崲綆楃紪鐮併?br /> 鏇村
鍦ㄦ湰鏂囩殑鏈鍚庯紝鎴戞兂鍥炲埌C++鐨剆tream闂?shù)笂銆傜敤fstream杞崲濡傛鐨勭畝鍗曪紝sstream鍗翠笉鏀寔銆傛敼閫犱竴涓敮鎸乧odecvt鐨?string stream闇瑕佹敼閫燽asic_stringbuf銆俠asic_stringbuf鍜宐asic_filebuf閮芥淳鐢熻嚜 basic_streambuf錛屾墍涓嶅悓鐨勬槸basic_filebuf鍦ㄦ瀯閫犲拰open()鐨勬椂鍊欒皟鐢ㄤ簡(jiǎn)codecvt錛屽彧闇瑕佸湪 basic_stringbuf涓坊鍔犺繖涓姛鑳藉氨鍙互浜?jiǎn)銆傝璧鋒潵瀹規(guī)槗錛屽疄闄呬笂鏄渶瑕侀噸鏂版敼閫犱竴涓猄TL妯℃澘錛屽敖綆¤繖浜涙ā鏉挎簮浠g爜閮芥槸鍦ㄦ爣鍑嗗簱澶存枃浠朵腑鐜版垚 鐨勶紝浣嗘槸鎴戣繕鏄按騫蟲湁闄愶紝娌℃湁鍘繪繁絀朵簡(jiǎn)銆傚彟澶栦竴涓濊礬鏄瀯寤轟竴涓熀浜庡唴瀛樻槧灝勭殑铏氭嫙鏂囦歡錛岃繖涓鏋跺湪boost鐨刬ostreams搴撲腑錛屾湁鍏磋叮鐨勬湅鍙嬪彲 浠ユ繁鍏ョ殑鐮旂┒銆?br /> 錛堝畬錛?/p>