锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
紜紪鐮佺殑紜激
鎴戜滑鐜板湪鐭ラ亾錛孋/C++鐨勫紿勮漿鎹㈡槸渚濊禆緋葷粺鐨刲ocale鐨勶紝騫朵笖鍦ㄨ繍琛屾椂瀹屾垚銆傝冭檻榪欐牱涓縐嶆儏鍐碉紝鎴戜滑鍦ㄧ畝浣撲腑鏂嘩indows涓嬬紪璇戝涓嬭鍙ワ細
const char* s = "涓枃abc";
鏍規(guī)嵁鎴戜滑涔嬪墠鐨勮璁猴紝緙栬瘧鍣ㄥ皢鎸夌収Windows Codepage936錛圙B2312錛夊榪欎釜瀛楃涓茶繘琛岀紪鐮併傚鏋滄垜浠湪紼嬪簭涓繍琛屽紿勮漿鎹㈠嚱鏁幫紝灝唖杞崲涓哄瀛楃涓瞱s錛屽鏋滆繖涓▼搴忚繍琛屽湪綆浣撲腑鏂囩幆澧冧笅鏄病闂鐨勶紝灝嗘墽琛屼粠GB2312鍒癠CS-2BE鐨勮漿鎹紱浣嗘槸錛屽鏋滃湪鍏朵粬璇█鐜涓嬶紝姣斿鏄箒浣撲腑鏂嘊IG5錛岀▼搴忓皢鏍規(guī)嵁緋葷粺鐨刲ocale鎵ц浠嶣IG5鍒癠CS-2BE鐨勮漿鎹紝榪欐樉鐒跺氨鍑虹幇浜嗛敊璇?br>
琛ユ晳
鏈夋病鏈夎ˉ鏁戣繖涓棶棰樼殑鍔炴硶鍛紵涓涓В鍐蟲柟妗堝氨鏄墽琛屼笉渚濊禆locale鐨勫紿勮漿鎹€傚疄闄呬笂錛岃繖灝卞凡緇忎笉鏄紿勮漿鎹箣闂寸殑闂浜嗭紝鑰屾槸緙栫爜涔嬮棿杞崲鐨勯棶棰樹簡銆傛垜浠彲浠ョ敤GNU鐨刲ibiconv瀹炵幇浠繪剰緙栫爜闂寸殑杞崲錛屽浜庝互涓婄殑鍏蜂綋鎯呭喌錛屾寚鏄庢槸浠嶨B2312鍒癠CS-2BE灝變笉浼氬嚭閿欍傦紙璇峰弬鑰冩湰浜哄墠闈㈢殑绔犺妭錛?a title=win32涓嬬殑libiconv href="http://www.shnenglu.com/lf426/archive/2008/03/30/45738.html">win32涓嬬殑libiconv錛夛紝浣嗚繖鏄劇劧鏄竴涓鎷欑殑絳栫暐錛氭垜浠湪綆浣撲腑鏂嘩indows涓嬪繀欏諱嬌鐢℅B2312鍒癠CS-2BE鐗堟湰鐨勫紿勮漿鎹㈠嚱鏁幫紱鍒頒簡BIG5鐜涓嬶紝灝卞繀欏婚噸鏂板啓浠嶣IG5鍒癠CS-2BE鐨勫紿勮漿鎹㈠嚱鏁般?br>
Windows鐨勭瓥鐣?br>
Windows鐨勭瓥鐣ユ槸娣樻卑浜嗙獎瀛楃涓詫紝騫茶剢鍙敤瀹藉瓧絎︿覆銆傛墍鏈夌殑紜紪鐮佸叏閮ㄥ姞涓婄壒瀹氬畯錛屾瘮濡俆EXT()錛屽鏋滅▼搴忔槸鎵璋揢nicode緙栬瘧錛屽湪緙栬瘧鏃跺氨緲昏瘧涓篣CS2-BE鈥斺擶indows鑷О涓篣nicode緙栫▼錛屽叾鏈川鏄嬌鐢ㄤ簡UCS-2BE鐨?6浣嶅瀛楃涓層?br>
Linux鐨勭瓥鐣?br>
Linux涓嬫牴鏈氨涓嶅瓨鍦ㄨ繖涓棶棰橈紒鍥犱負鍚勭璇█鐨凩inux閮戒嬌鐢║TF-8鐨勭紪鐮侊紝鎵浠ワ紝鏃犺緋葷粺locale濡備綍鍙樺寲錛岀獎鍒板杞崲鐨勮鍒欎竴鐩存槸UTF-8鍒癠TF32-BE 銆?br>
璺ㄥ鉤鍙扮瓥鐣?br>
鍥犱負鍦?6浣嶇殑鑼冨洿鍐咃紝UTF32-BE鐨勫墠16浣嶄負0錛屽悗16浣嶄笌UCS2-BE鏄竴鏍風殑錛屾墍浠ワ紝鍗充嬌wchar_t鐨剆izeof()涓嶄竴鏍鳳紝鍦ㄤ竴鑸儏鍐典笅錛岃法騫沖彴浣跨敤瀹藉瓧絎︼紙涓詫級涔熷簲璇ユ槸鍏煎鐨勩備絾鏄緷鐒跺瓨鍦ㄦ綔鍦ㄧ殑闂錛屽氨鏄偅浜?瀛楄妭鐨刄TF32緙栫爜銆?br>
gettext絳栫暐
浠ヤ笂閮芥槸灝咥SCII鍙婁互澶栫殑緙栫爜紜紪鐮佸湪紼嬪簭涓殑鍔炴硶銆侴NU鐨刧ettext鎻愪緵浜嗗彟澶栦竴縐嶉夋嫨錛氬湪紼嬪簭涓彧紜紪鐮丄SCII錛屽璇█鏀寔鐢眊ettext鍑芥暟搴撳湪榪愯鏃跺姞杞姐傦紙瀵筭ettext鐨勪粙緇嶈鍙傝冩湰浜哄墠闈㈢殑绔犺妭錛?a title=Win32涓嬬殑GetText href="http://www.shnenglu.com/lf426/archive/2008/03/30/45723.html">Win32涓嬬殑GetText錛夈俫ettext鐨勫璇█緲昏瘧鏂囦歡涓嶅湪紼嬪簭涓紝鑰屾槸鍗曠嫭鐨勬彁鍑烘潵鏀懼湪鐗瑰畾鐨勪綅緗俫ettext鏄庣‘鐨勭煡閬撹繖浜涚炕璇戞枃浠剁殑緙栫爜錛屾墍浠ュ彲浠ュ噯紜殑鍛婅瘔緇欑郴緇熺炕璇戠殑姝g‘淇℃伅錛岃岀郴緇熷皢榪欎簺淇℃伅浠ュ綋鍓嶇殑緋葷粺locale緙栫爜鎴愮獎瀛楃涓插弽棣堢粰紼嬪簭銆備緥濡傦紝鍦ㄧ畝浣撲腑鏂嘩indows涓紝gettext鐨刾o鏂囦歡涔熷彲浠ヤ互UTF-8鍌ㄥ瓨錛実ettext灝唒o鏂囦歡緲昏瘧鎴恗o鏂囦歡錛岀‘淇漨o鏂囦歡鍦ㄤ換浣曠郴緇熷拰璇█鐜涓嬮兘鑳藉姝g‘緲昏瘧銆傚湪榪愯鏄紶緇檞in32紼嬪簭鐨勭獎涓茬鍚堝綋鍓峫ocale錛屾槸GB2312銆俫ettext璁╁浗闄呭寲鐨勭炕璇戞洿鍔犵殑鏂逛究錛岀己鐐規(guī)槸鐩墠鎴戞病鎵懼埌鏀寔瀹藉瓧絎︿覆鐨勭増鏈紙鎹鏄湁ugettext()鏀寔瀹藉瓧絎︿覆錛夛紝鎵浠ヨ浣跨敤gettext鍙兘浣跨敤紿勫瓧絎︿覆銆備絾鏄痝ettext鍙互杞崲鍒板瀛楃涓詫紝鑰屼笖涓嶄細鍑虹幇瀹界獎杞崲鐨勯棶棰橈紝鍥犱負gettext鏄繍琛屾椂鏍規(guī)嵁locale緲昏瘧鐨勩備緥濡傦細
const char* s = gettext("Chinese a b c");
鍏朵腑"Chinese a b c"鍦╬o涓殑緲昏瘧鏄?涓枃abc"
浣跨敤渚濊禆locale鐨勮繍琛屾椂瀹界獎杞崲鍑芥暟錛?br>const std::wstring wstr = s2ws(s);
榪愯鏃惰皟鐢ㄨpo鏂囦歡瀵瑰簲鐨刴o鏂囦歡錛屽湪綆浣撲腑鏂囩幆澧冧笅灝變互GB2312浼犵粰紼嬪簭錛屽湪綣佷綋涓枃涓氨浠IG5浼犵粰紼嬪簭錛岃繖鏍穝2ws()鎬昏兘澶熸甯告崲綆楃紪鐮併?br>
鏇村
鍦ㄦ湰鏂囩殑鏈鍚庯紝鎴戞兂鍥炲埌C++鐨剆tream闂涓娿傜敤fstream杞崲濡傛鐨勭畝鍗曪紝sstream鍗翠笉鏀寔銆傛敼閫犱竴涓敮鎸乧odecvt鐨剆tring stream闇瑕佹敼閫燽asic_stringbuf銆俠asic_stringbuf鍜宐asic_filebuf閮芥淳鐢熻嚜basic_streambuf錛屾墍涓嶅悓鐨勬槸basic_filebuf鍦ㄦ瀯閫犲拰open()鐨勬椂鍊欒皟鐢ㄤ簡codecvt錛屽彧闇瑕佸湪basic_stringbuf涓坊鍔犺繖涓姛鑳藉氨鍙互浜嗐傝璧鋒潵瀹規(guī)槗錛屽疄闄呬笂鏄渶瑕侀噸鏂版敼閫犱竴涓猄TL妯℃澘錛屽敖綆¤繖浜涙ā鏉挎簮浠g爜閮芥槸鍦ㄦ爣鍑嗗簱澶存枃浠朵腑鐜版垚鐨勶紝浣嗘槸鎴戣繕鏄按騫蟲湁闄愶紝娌℃湁鍘繪繁絀朵簡銆傚彟澶栦竴涓濊礬鏄瀯寤轟竴涓熀浜庡唴瀛樻槧灝勭殑铏氭嫙鏂囦歡錛岃繖涓鏋跺湪boost鐨刬ostreams搴撲腑錛屾湁鍏磋叮鐨勬湅鍙嬪彲浠ユ繁鍏ョ殑鐮旂┒銆?br>錛堝畬錛?
]]>
C++鐨勬祦鍜屾湰鍦板寲絳栫暐闆?br>
BS鍦ㄨ璁++嫻佺殑鏃跺欏笇鏈涘叾鍏峰鏅鴻兘鍖栵紝騫朵笖鏄彲鎵╁睍鐨勬櫤鑳藉寲錛屼篃灝辨槸璇達紝C++鐨勬祦鍙互“璇繪噦”涓浜涘唴瀹廣傛瘮濡傦細
std::stringstream sstr(str);
int i;
sstr >> i;
std::stringstream sstr;
sstr << i;
std::string str = sstr.str();
#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 <fstream>
#include "string_wstring_fstream.hpp"
const std::wstring s2ws(const std::string& s)
{
std::locale sys_loc("");
std::ofstream ofs("cvt_buf");
ofs << s;
ofs.close();
std::wifstream wifs("cvt_buf");
wifs.imbue(sys_loc);
std::wstring wstr;
wifs >> wstr;
wifs.close();
return wstr;
}
const std::string ws2s(const std::wstring& s)
{
std::locale sys_loc("");
std::wofstream wofs("cvt_buf");
wofs.imbue(sys_loc);
wofs << s;
wofs.close();
std::ifstream ifs("cvt_buf");
std::string str;
ifs >> str;
ifs.close();
return str;
}
]]>
locale鍜宖acet
C++鐨刲ocale妗嗘灦姣擟鏇村畬澶囥侰++闄や簡涓涓緇熸湰鍦扮瓥鐣ラ泦locale錛岃繕鍙互涓簂ocale鎸囧畾鍏蜂綋鐨勭瓥鐣acet錛岀敋鑷沖彲浠ョ敤鑷繁瀹氫箟鐨刦acet鍘繪敼閫犱竴涓幇鏈夌殑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綾誨疄渚嬪寲鎴愪簡瀵硅薄錛岀敱姝ゅ氨鍙互浣跨敤榪欎釜facet瀵硅薄鐨勬垚鍛樺嚱鏁般?br>
codecvt
codecvt灝辨槸涓涓爣鍑唂acet銆傚湪C++鐨勮璁℃鏋墮噷錛岃繖鏄竴涓氱敤鐨勪唬鐮佽漿鎹㈡ā鏉庫斺斾篃灝辨槸璇達紝騫朵笉鏄粎浠呬負瀹界獎杞崲鍒跺畾鐨勩?br>templat <class I, class E, class State> class std::codecvt: public locale, public codecvt_base{...};
I琛ㄧず鍐呴儴緙栫爜錛孍琛ㄧず澶栭儴緙栫爜錛孲tate鏄笉鍚岃漿鎹㈡柟寮忕殑鏍囪瘑錛屽鏋滃畾涔夊涓嬬被鍨嬶細
typedef std::codecvt<wchar_t, char, mbstate_t> CodecvtFacet;
閭d箞CodecvtFacet灝辨槸涓涓爣鍑嗙殑瀹界獎杞崲facet錛屽叾涓璵bstate_t鏄爣鍑嗗紿勮漿鎹㈢殑State銆?br>
鍐呴儴緙栫爜鍜屽閮ㄧ紪鐮?br>
鎴戜滑鑰冭檻絎?鑺備腑鎻愬埌鐨凜++緙栬瘧鍣ㄨ鍙栨簮鏂囦歡鏃跺欑殑鎯呭艦錛屽綋璇誨埌L"涓枃abc"鐨勬椂鍊欙紝澶栭儴緙栫爜錛屼篃灝辨槸婧愭枃浠剁殑緙栫爜錛屾槸GB2312鎴栬匲TF-8鐨刢har錛岃岀紪璇戝櫒蹇呴』灝嗗叾緲昏瘧涓篣CS-2BE鎴栬匲TF-32BE鐨剋char_t錛岃繖涔熷氨鏄▼搴忕殑鍐呴儴緙栫爜銆傚鏋滀笉鏄瀛楃涓詫紝鍐呭緙栫爜閮芥槸char錛屼篃灝變笉闇瑕佽漿鎹簡銆傜被浼肩殑錛屽綋C++璇誨啓鏂囦歡鐨勬椂鍊?錛屽氨浼氬彲鑳介渶瑕佸埌鍐呭緙栫爜杞崲銆備簨瀹炰笂錛宑odecvt灝辨鏄鏂囦歡嫻佺紦瀛榖asic_filebuf鎵浣跨敤鐨勩傜悊瑙h繖涓鐐瑰緢閲嶈錛屽師鍥犱細鍦ㄤ笅涓灝忚妭鐪嬪埌銆?br>
CodecvtFacet鐨刬n()鍜宱ut()
鍥犱負鍦–odecvtFacet涓紝鍐呴儴緙栫爜璁劇疆涓簑char_t錛屽閮ㄧ紪鐮佽緗負char錛岃漿鎹㈡ā寮忔槸鏍囧噯瀹界獎杞崲mbstate_t錛屾墍浠ワ紝綾繪柟娉昳n()灝辨槸浠巆har鏍囧噯杞崲鍒皐char_t錛宱ut()灝辨槸浠巜char_t鏍囧噯杞崲鍒癱har銆傝繖灝辨垚浜嗘垜浠闇瑕佺殑鍐呭杞崲鍑芥暟銆?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寮曠敤錛屼繚瀛樼潃杞崲浣嶇Щ鐘舵佷俊鎭傝繖閲岄渶瑕侀噸鐐瑰己璋冪殑鏄紝鍥犱負杞崲鐨勫疄闄呭伐浣滀氦緇欎簡榪愯鏃跺簱錛屼篃灝辨槸璇達紝杞崲鍙兘涓嶆槸鍦ㄧ▼搴忕殑涓昏繘紼嬩腑瀹屾垚鐨勶紝鑰岃漿鎹㈠伐浣滀緷璧栦簬鏌ヨs鐨勫鹼紝鍥犳錛屽鏋渟鍦ㄨ漿鎹㈢粨鏉熷墠鏋愭瀯錛屽氨鍙兘鎶涘嚭榪愯鏃跺紓甯搞傛墍浠ワ紝鏈瀹夊叏鐨勫姙娉曟槸錛屽皢s璁劇疆涓哄叏灞鍙橀噺錛?br>const鐨?涓寚閽堝垎鍒槸寰呰漿鎹㈠瓧絎︿覆鐨勮搗鐐癸紝緇堢偣錛屽拰鍑虹幇閿欒鏃跺欑殑鍋滅偣錛堢殑涓嬩竴涓綅緗級錛涘彟澶?涓寚閽堟槸杞崲鐩爣瀛楃涓茬殑璧風偣錛岀粓鐐逛互鍙婂嚭鐜伴敊璇椂鍊欑殑鍋滅偣錛堢殑涓嬩竴涓綅緗級銆?br>
浠g爜濡備笅錛?br>澶存枃浠?br>
#ifndef STRING_WSTRING_CPPCVT_HPP
#define STRING_WSTRING_CPPCVT_HPP
#include <iostream>
#include <string>
const std::wstring s2ws(const std::string& s);
const std::string ws2s(const std::wstring& s);
#endif
mbstate_t in_cvt_state;
mbstate_t out_cvt_state;
const std::wstring s2ws(const std::string& s)
{
std::locale sys_loc("");
const char* src_str = s.c_str();
const size_t BUFFER_SIZE = s.size() + 1;
wchar_t* intern_buffer = new wchar_t[BUFFER_SIZE];
wmemset(intern_buffer, 0, BUFFER_SIZE);
const char* extern_from = src_str;
const char* extern_from_end = extern_from + s.size();
const char* extern_from_next = 0;
wchar_t* intern_to = intern_buffer;
wchar_t* intern_to_end = intern_to + BUFFER_SIZE;
wchar_t* intern_to_next = 0;
typedef std::codecvt<wchar_t, char, mbstate_t> CodecvtFacet;
CodecvtFacet::result cvt_rst =
std::use_facet<CodecvtFacet>(sys_loc).in(
in_cvt_state,
extern_from, extern_from_end, extern_from_next,
intern_to, intern_to_end, intern_to_next);
if (cvt_rst != CodecvtFacet::ok) {
switch(cvt_rst) {
case CodecvtFacet::partial:
std::cerr << "partial";
break;
case CodecvtFacet::error:
std::cerr << "error";
break;
case CodecvtFacet::noconv:
std::cerr << "noconv";
break;
default:
std::cerr << "unknown";
}
std::cerr << ", please check in_cvt_state."
<< std::endl;
}
std::wstring result = intern_buffer;
delete []intern_buffer;
return result;
}
const std::string ws2s(const std::wstring& ws)
{
std::locale sys_loc("");
const wchar_t* src_wstr = ws.c_str();
const size_t MAX_UNICODE_BYTES = 4;
const size_t BUFFER_SIZE =
ws.size() * MAX_UNICODE_BYTES + 1;
char* extern_buffer = new char[BUFFER_SIZE];
memset(extern_buffer, 0, BUFFER_SIZE);
const wchar_t* intern_from = src_wstr;
const wchar_t* intern_from_end = intern_from + ws.size();
const wchar_t* intern_from_next = 0;
char* extern_to = extern_buffer;
char* extern_to_end = extern_to + BUFFER_SIZE;
char* extern_to_next = 0;
typedef std::codecvt<wchar_t, char, mbstate_t> CodecvtFacet;
CodecvtFacet::result cvt_rst =
std::use_facet<CodecvtFacet>(sys_loc).out(
out_cvt_state,
intern_from, intern_from_end, intern_from_next,
extern_to, extern_to_end, extern_to_next);
if (cvt_rst != CodecvtFacet::ok) {
switch(cvt_rst) {
case CodecvtFacet::partial:
std::cerr << "partial";
break;
case CodecvtFacet::error:
std::cerr << "error";
break;
case CodecvtFacet::noconv:
std::cerr << "noconv";
break;
default:
std::cerr << "unknown";
}
std::cerr << ", please check out_cvt_state."
<< std::endl;
}
std::string result = extern_buffer;
delete []extern_buffer;
return result;
}
]]>
std::locale
閫氳繃鍓嶉潰涓よ妭鐨勭煡璇嗭紝鎴戜滑鐭ラ亾浜嗗湪C/C++涓紝瀛楃錛堜覆錛夊拰瀹藉瓧絎︼紙涓詫級涔嬮棿鐨勮漿鎹笉鏄畝鍗曠殑錛屽浐瀹氱殑鏁板鍏崇郴錛屽紿勮漿鎹緷璧栦簬鏈湴鍖栫瓥鐣ラ泦錛坙ocale錛夈傛崲鍙ヨ瘽璇達紝涓涓▼搴忓湪榪愯涔嬪墠騫朵笉鐭ラ亾緋葷粺鐨勬湰鍦板寲絳栫暐闆嗘槸浠涔堬紝紼嬪簭鍙湁鍦ㄨ繍琛屼箣鍚庢墠閫氳繃locale鑾峰緱褰撴椂鐨勬湰鍦板寲絳栫暐闆嗐?br>C鏈夎嚜宸辯殑locale鍑芥暟錛屾垜浠繖閲岀洿鎺ヤ粙緇岰++鐨刲ocale綾匯?br>鍏堣璁簂ocale鐨勬瀯閫犲嚱鏁幫細
locale() throw();
榪欎釜鏋勯犲嚱鏁版槸鑾峰緱褰撳墠紼嬪簭鐨刲ocale錛岀敤娉曞涓嬶細
std::locale app_loc = std::locale();
鎴栬咃紙榪欐槸鏋勯犲璞$殑涓ょ琛ㄧず鏂瑰紡錛屽悗鍚岋級
std::locale app_loc;
鍙﹀涓涓瀯閫犲嚱鏁版槸錛?br>explicit locale(const char* name);
榪欎釜鏋勯犲嚱鏁頒互name鐨勫悕瀛楀垱寤烘柊鐨刲ocale銆傞噸瑕佺殑locale瀵硅薄鏈夛細
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
闄や簡榪欎簺錛屽叾瀹冪殑name鍏蜂綋鍚嶅瓧渚濊禆浜嶤++緙栬瘧鍣ㄥ拰鎿嶄綔緋葷粺錛屾瘮濡侺inux涓媑cc涓枃緋葷粺鐨刲ocale鍚嶅瓧涓?zh_CN.UTF-8"錛屼腑鏂嘩indows鍙互鐢?chs"錛堟洿鍔犲畬鏁寸殑鍚嶅瓧鍙互鐢╪ame()鍑芥暟鏌ョ湅錛夈?br>
mbstowcs()鍜寃cstombs()
榪欎袱涓狢榪愯鏃跺簱鍑芥暟渚濊禆浜庡叏灞locale榪涜杞崲錛屾墍浠ワ紝浣跨敤鍓嶅繀欏誨厛璁劇疆鍏ㄥ眬locale銆?br>std::locale宸茬粡鍖呭惈鍦?lt;iostream>涓簡錛屽啀鍔犱笂鎴戜滑闇瑕佺敤鍒扮殑C++瀛楃涓詫紝鎵浠ュ寘鍚?lt;string>銆?br>鎴戜滑鍏堢湅紿勫埌瀹界殑杞崲鍑芥暟錛?br>
{
std::locale old_loc =
std::locale::global(std::locale(""));
const char* src_str = s.c_str();
const size_t buffer_size = s.size() + 1;
wchar_t* dst_wstr = new wchar_t[buffer_size];
wmemset(dst_wstr, 0, buffer_size);
mbstowcs(dst_wstr, src_str, buffer_size);
std::wstring result = dst_wstr;
delete []dst_wstr;
std::locale::global(old_loc);
return result;
}
{
std::locale old_loc =
std::locale::global(std::locale(""));
const wchar_t* src_wstr = ws.c_str();
size_t buffer_size = ws.size() * 4 + 1;
char* dst_str = new char[buffer_size];
memset(dst_str, 0, buffer_size);
wcstombs(dst_str ,src_wstr, buffer_size);
std::string result = dst_str;
delete []dst_str;
std::locale::global(old_loc);
return result;
}
]]>
Unicode鍜孶CS
Unicode鍜孶CS鏄袱涓嫭绔嬬殑緇勭粐鍒嗗埆鍒跺畾鐨勪竴濂楃紪鐮佹爣鍑嗭紝浣嗘槸鍥犱負鍘嗗彶鐨勫師鍥狅紝榪欎袱濂楁爣鍑嗘槸瀹屽叏涓鏍風殑銆俇nicode榪欎釜璇嶇敤寰楁瘮杈冨鐨勫師鍥犲彲鑳芥槸鍥犱負姣旇緝瀹規(guī)槗璁頒綇錛屽鏋滄病鏈夌壒鍒殑澹版槑錛屽湪鏈枃鎵鎻愬強鐨刄nicode鍜孶CS灝辨槸涓涓剰鎬濄俇nicode鐨勭洰鏍囨槸寤虹珛涓濂楀彲浠ュ寘鍚漢綾繪墍鏈夎璦鏂囧瓧絎﹀彿浣犳兂寰楀埌鎯充笉鍒扮殑鍚勭涓滆タ鐨勭紪鐮侊紝鍏剁紪鐮佸閲忕敋鑷抽鐣欎簡鐏槦璇互鍙婇摱娌崇郴浠ュ璇█鐨勭┖闂粹斺斿紑涓帺絎戯紝鍙嶆綆鍗曠殑璇達紝Unicode緙栫爜闆嗚凍澶熺殑澶э紝濡傛灉鐢ㄨ綆楁満鍗曚綅鏉ヨ〃紺猴紝鍏舵暟閲忔瘮3涓瓧鑺傚ぇ涓浜涳紝涓嶅埌4涓瓧鑺傘?br>
Unicode鍜孶TF
鍥犱負Unicode鍖呭惈鐨勫唴瀹瑰お澶氾紝鍏剁紪鐮佸湪璁$畻鏈轟腑鐨勮〃紺烘柟娉曞氨鎴愪負浜嗕竴涓湁蹇呰鐮旂┒鐨勯棶棰樸備紶緇熺紪鐮侊紝姣斿鏍囧噯鐨?浣岮SCII錛屽湪璁$畻鏈轟腑鐨勮〃紺烘柟娉曞氨鏄崰涓涓瓧鑺傜殑鍚?浣嶏紝榪欎技涔庢槸涓嶉渶瑕佽В閲婂氨絎﹀悎澶у涔犳儻鐨勮〃紺烘柟娉曘備絾鏄綋浠奤nicode鐨勬繪暟杈懼埌32浣嶏紙璁$畻鏈虹殑鏈灝忓崟浣嶆槸瀛楄妭錛屾墍浠ュぇ浜?瀛楄妭錛屽氨鍙兘鑷沖皯鐢?瀛楄妭琛ㄧず錛夛紝瀵逛簬澶ч儴鍒嗗父鐢ㄥ瓧絎︼紝姣斿Unicode緙栫爜鍙崰涓涓瓧鑺傚ぇ灝忕殑鑻辮瀛楁瘝錛屽崰涓や釜瀛楄妭澶у皬姹夊瓧錛岄兘鐢?涓瓧鑺傛潵鍌ㄥ瓨澶ア渚堜簡銆傚彟澶栵紝濡傛灉閮界敤4瀛楄妭鐩存帴琛ㄧず錛屽氨涓嶅彲閬垮厤鐨勫嚭鐜頒負0鐨勫瓧鑺傘傝屾垜浠煡閬擄紝鍦–璇█涓紝0x00鐨勫瓧鑺傚氨鏄?\0'錛岃〃紺虹殑鏄竴涓瓧絎︿覆錛坈har瀛楃涓詫紝闈瀢char_t錛夌殑緇撴潫錛屾崲鍙ヨ瘽璇達紝C椋庢牸鐨刢har瀛楃涓叉棤娉曡〃紺篣nicode銆?br>鍥犱負綾諱技鐨勭縐嶉棶棰橈紝涓篣nicode鍦ㄨ綆楁満涓殑緙栫爜鏂規(guī)硶鍑虹幇浜嗭紝榪欏氨鏄疷TF錛涙墍瀵瑰簲鐨勶紝涓篣CS緙栫爜瀹炵幇鐨勬柟寮忎篃鏈夎嚜宸辯殑璇存硶銆備竴鑸潵璇達紝UTF-x錛寈琛ㄧず榪欏緙栫爜涓涓崟浣嶈嚦灝戝崰鐢▁浣嶏紝鍥犱負Unicode鏈闀胯揪鍒?2浣嶏紝鎵浠TF-x閫氬父鏄彉闀跨殑鈥斺旈櫎浜哢TF-32錛涜孶CS-y琛ㄧず涓涓崟浣嶅氨鍗犵敤y涓瓧鑺傦紝鎵浠ヨ兘琛ㄧず褰撲粖Unicode鐨刄CS-y鍙湁UCS-4錛屼絾鏄洜涓哄巻鍙茬殑鍘熷洜錛屽綋Unicode榪樻病閭d箞搴炲ぇ鐨勬椂鍊欙紝2涓瓧鑺傝凍澶熻〃紺猴紝鎵浠ユ湁UCS-2錛岀幇鍦ㄧ湅鏉ワ紝UCS-2鎵鑳借〃紺虹殑Unicode鍙槸褰撲粖Unicode鐨勪竴涓瓙闆嗐?br>涔熷氨鏄錛屽鏋滄煇縐嶇紪鐮侊紝鑳芥牴鎹竴瀹氱殑瑙勫垯綆楁硶錛屽緱鍒癠nicode緙栫爜錛岄偅涔堣繖縐嶇紪鐮佹柟寮忓氨鍙互縐頒箣涓篣TF銆?br>
UTF-8鍜學indows GB2312
UTF-8鏄竴濂?#8220;鑱槑”鐨勭紪鐮侊紝鍙兘鐢?錛?錛?錛?涓瓧鑺傝〃紺恒傞氳繃UTF-8鐨勭畻娉曪紝姣忎竴涓瓧鑺傝〃紺虹殑淇℃伅閮藉緢鏄庣‘錛氳繖鏄笉鏄煇涓猆nicode緙栫爜鐨勭涓涓瓧鑺傦紱濡傛灉鏄涓涓瓧鑺傦紝榪欐槸涓涓嚑浣峌nicode緙栫爜銆傝繖縐?#8220;鑱槑”琚О涓篣TF-8鐨勮嚜鎴戝悓姝ワ紝涔熸槸UTF-8鎴愪負緗戠粶浼犺緭鏍囧噯緙栫爜鐨勫師鍥犮?br>鍙﹀錛孶TF-8涔熶笉浼氬嚭鐜?瀛楄妭錛屾墍浠ュ彲浠ヨ〃紺轟負char瀛楃涓詫紝鎵浠ュ彲浠ユ垚涓虹郴緇熺殑緙栫爜銆侺inux緋葷粺榛樿浣跨敤UTF-8緙栫爜銆?br>Windows GB2312涓鑸嚜縐頒負GB2312錛屽叾瀹炵湡姝g殑鍚嶅瓧搴旇鏄疻indows Codepage 936錛岃繖涔熸槸涓縐嶅彉闀跨殑緙栫爜錛?涓瓧鑺傝〃紺轟紶緇熺殑ASCII閮ㄥ垎錛涙眽瀛楅儴鍒嗘槸涓や釜瀛楄妭鐨凣BK錛堝浗鏍囨墿錛堝睍錛夛紝鎷奸煶澹版瘝錛夈侰odepage 936涔熷彲浠ヨ〃紺轟負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鏄竴鏍風殑銆俇TF-16涓嶅儚UTF-8錛屾病鏈夎嚜鎴戝悓姝ユ満鍒訛紝鎵浠ワ紝緙栫爜澶т綅鍦ㄥ墠榪樻槸灝忎綅鍦ㄥ墠錛屽氨鎴愪簡瑙佷粊瑙佹櫤鐨勯棶棰樸傛垜浠湪絎?鑺備腑錛?#8220;涓?#8221;鐨刄CS-2BE錛堝洜涓烘槸涓や釜瀛楄妭錛屾墍浠ヤ篃灝辨槸UTF-16BE錛夌紪鐮佹槸0x4E2D錛岃繖閲岀殑BE灝辨槸澶т綅鍦ㄥ悗鐨勬剰鎬濓紙涔熷氨鏄皬浣嶅湪鍓嶄簡錛夛紝瀵瑰簲鐨勶紝濡傛灉鏄疷CS-2LE錛岀紪鐮佸氨鎴愪簡0x2D4E銆?br>Windows涓殑wchar_t灝辨槸閲囩敤UCS-2BE緙栫爜銆傞渶瑕佹寚鍑虹殑鏄紝C++鏍囧噯涓wchar_t鐨勮姹傛槸瑕佽兘琛ㄧず鎵鏈夌郴緇熻兘璇嗗埆鐨勫瓧絎︺俉indows鑷О鏀寔Unicode錛屼絾鏄叾wchar_t鍗翠笉鑳借〃紺烘墍鏈夌殑Unicode錛岀敱姝よ繚鑳屼簡C++鏍囧噯銆?br>
UTF-32鍜孶CS-4
UTF-32鍦ㄧ洰鍓嶉樁孌電瓑浠蜂簬UCS-4錛岄兘鐢ㄥ畾闀跨殑4涓瓧鑺傝〃紺恒俇TF-32鍚屾牱瀛樺湪BE鍜孡E鐨勯棶棰樸侺inux鐨剋char_t緙栫爜灝辨槸UTF-32BE銆傚湪16浣嶄互鍐呯殑鏃跺欙紝UTF-32BE鐨勫悗涓や綅錛堝墠涓や綅鏄?x00 0x00錛夌瓑浠蜂簬UTF-16BE涔熷氨絳変環(huán)浜嶶CS-2BE
BOM
涓轟簡璇存槑涓涓枃浠墮噰鐢ㄧ殑鏄粈涔堢紪鐮侊紝鍦ㄦ枃浠舵渶寮濮嬬殑閮ㄥ垎錛屽彲浠ユ湁BOM錛屾瘮濡?xFE 0xFF琛ㄧずUTF-16BE錛?xFF 0xFE 0x00 0x00琛ㄧずUTF-32LE銆俇TF-8鍘熸湰鏄笉闇瑕丅OM鐨勶紝鍥犱負鍏惰嚜鎴戝悓姝ョ殑鐗規(guī)э紝浣嗘槸涓轟簡鏄庣‘璇存槑榪欐槸UTF-8錛堣屼笉鏄鏂囨湰緙栬緫鍣ㄥ幓鐚滐級錛屼篃鍙互鍔犱笂UTF-8鐨凚OM錛?xEF 0xBB 0xBF
浠ヤ笂鍐呭閮借榪板緱寰堟鐣ワ紝璇︾粏淇℃伅璇鋒煡闃呯淮鍩虹櫨縐戠浉鍏沖唴瀹廣?
]]>
“榪欎釜闂姣斾綘鎯寵薄涓鏉?#8221;
錛堟垜涔熷涓婤S鐨勯鏍鹼紝铏界劧榪欏彞璇濇槸鎴戣嚜宸變復鏃舵兂璇寸殑銆俕^錛?br>
浠庡瓧絎﹀埌鏁存暟
char鏄竴縐嶆暣鏁扮被鍨嬶紝榪欏彞璇濈殑鍚箟鏄紝char鎵鑳借〃紺虹殑瀛楃鍦–/C++涓兘鏄暣鏁扮被鍨嬨傚ソ錛屾帴涓嬫潵錛屽緢澶氭枃绔犲氨浼氫婦鍑轟竴涓吀鍨嬩緥瀛愶紝姣斿錛?a'鐨勬暟鍊煎氨鏄?x61銆傝繖縐嶈娉曞鍚楋紵濡傛灉浣犵粏蹇冪殑璇昏繃K&R鍜孊S瀵逛簬C鍜孋++鎻忚堪鐨勫師钁楋紝浣犲氨浼氶┈涓婂弽椹抽亾錛?x61鍙槸'a'鐨凙SCII鍊鹼紝騫舵病鏈変換浣曡瀹欳/C++鐨刢har鍊煎繀欏誨搴擜SCII銆侰/C++鐢氳嚦娌℃湁瑙勫畾char鍗犲嚑浣嶏紝鍙槸瑙勫畾浜唖izeof(char)絳変簬1銆?br>褰撶劧錛岀洰鍓嶅ぇ閮ㄥ垎鎯呭喌涓嬶紝char鏄?浣嶇殑錛屽茍涓旓紝鍦ˋSCII鑼冨洿鍐呯殑鍊鹼紝涓嶢SCII瀵瑰簲銆?br>
鏈湴鍖栫瓥鐣ラ泦錛坙ocale錛?br>
“灝?a'緲昏瘧鎴?x61鐨勬暣鏁板?#8221;錛?#8220;灝咥SCII鑼冨洿鍐呯殑緙栫爜涓巆har鐨勬暣鏁板煎搴旇搗鏉?#8221;錛岀被浼艱繖鏍風殑瑙勫畾錛屾槸鐗瑰畾緋葷粺鍜岀壒瀹氱紪璇戝櫒鍒跺畾鐨勶紝C/C++涓湁涓壒瀹氱殑鍚嶈瘝鏉ユ弿榪拌繖縐嶈瀹氱殑闆嗗悎錛氭湰鍦板寲絳栫暐闆嗭紙locale銆備篃鏈夌炕璇戞垚“鐜板満”錛夈傝岀炕璇戔斺斾篃灝辨槸浠g爜杞崲錛坈odecvt錛夊彧鏄繖涓泦鍚堜腑鐨勪竴涓紝C++涓畾涔変負絳栫暐錛坒acet銆備篃鏈夌炕璇戜負“鍒婚潰”錛?br>
C/C++鐨勭紪璇戠瓥鐣?br>
“鏈湴鍖栫瓥鐣ラ泦”鏄釜寰堝ソ鐨勬蹇碉紝鍙儨鍦ㄥ瓧絎﹀拰瀛楃涓茶繖涓眰闈笂錛孋/C++騫朵笉浣跨敤錛圕++鐨刲ocale閫氬父鍙槸褰卞搷嫻侊紙stream錛夛級錛孋/C++浣跨敤鏇寸洿鎺ョ畝鍗曠殑絳栫暐錛氱‖緙栫爜銆?br>綆鍗曠殑璇達紝瀛楃錛堜覆錛夊湪紼嬪簭鏂囦歡錛堝彲鎵ц鏂囦歡錛岄潪婧愭枃浠訛級涓殑琛ㄧず錛屼笌鍦ㄧ▼搴忔墽琛屼腑鍦ㄥ唴瀛樹腑鐨勮〃紺轟竴鑷淬傝冭檻涓ょ鎯呭喌錛?br>A銆乧har c = 0x61;
B銆乧har c = 'a';
鎯呭喌A涓嬶紝緙栬瘧鍣ㄥ彲浠ョ洿鎺ヨ璇嗕綔涓烘暣鏁扮殑c錛屼絾鏄湪鎯呭喌B涓嬶紝緙栬瘧鍣ㄥ繀欏誨皢'a'緲昏瘧鎴愭暣鏁般傜紪璇戝櫒鐨勭瓥鐣ヤ篃寰堢畝鍗曪紝灝辨槸鐩存帴璇誨彇瀛楃錛堜覆錛夊湪婧愭枃浠朵腑鐨勭紪鐮佹暟鍊箋傛瘮濡傦細
const char* s = "涓枃abc";
榪欐瀛楃涓插湪GB2312錛圵indows 936錛夛紝涔熷氨鏄垜浠殑windows榛樿涓枃緋葷粺婧愭枃浠朵腑鐨勭紪鐮佷負錛?br>0xD6 0xD0 0xCE 0xC4 0x61 0x62 0x63
鍦║TF-8錛屼篃灝辨槸Linux榛樿緋葷粺婧愭枃浠朵腑鐨勭紪鐮佷負錛?br>0xE4 0xB8 0xAD 0xE6 0x96 0x87 0x61 0x62 0x63
涓鑸儏鍐典笅錛岀紪璇戝櫒浼氬繝瀹炰簬婧愭枃浠剁殑緙栫爜涓簊璧嬪鹼紝渚嬪鐨勬儏鍐墊瘮濡俈C浼氳嚜浣滆仾鏄庣殑鎶婂ぇ閮ㄥ垎鍏朵粬綾誨瀷緙栫爜鐨勫瓧絎︿覆杞崲鎴怗B2312錛堥櫎浜嗗儚UTF-8 without signature榪欐牱鐨勫垢瀛樿咃級銆?br>紼嬪簭鍦ㄦ墽琛岀殑鏃跺欙紝s涔熷氨淇濇寔鏄繖鏍風殑緙栫爜錛屼笉浼氬啀鍋氬叾浠栫殑杞崲銆?br>
瀹藉瓧絎?wchar_t
姝echar娌℃湁瑙勫畾澶у皬錛寃char_t鍚屾牱娌℃湁鏍囧噯闄愬畾錛屾爣鍑嗗彧鏄姹備竴涓獁char_t鍙互琛ㄧず浠諱綍緋葷粺鎵鑳借璇嗙殑瀛楃錛屽湪win32涓紝wchar_t涓?6浣嶏紱Linux涓槸32浣嶃倃char_t鍚屾牱娌℃湁瑙勫畾緙栫爜錛屽洜涓篣nicode鐨勬蹇墊垜浠悗闈㈡墠瑙i噴錛屾墍浠ヨ繖閲屽彧鏄彁涓涓嬶紝鍦╳in32涓紝wchar_t鐨勭紪鐮佹槸UCS-2BE錛涜孡inux涓槸UTF-32BE錛堢瓑浠蜂簬UCS-4BE錛夛紝涓嶈繃綆鍗曠殑璇達紝鍦?6浣嶄互鍐咃紝涓涓瓧絎︾殑榪?縐嶇紪鐮佸兼槸涓鏍風殑銆傚洜姝わ細
const wchar_t* ws = L"涓枃abc";
鐨勭紪鐮佸垎鍒負錛?br>0x4E2D 0x6587 0x0061 0x0062 0x0063 //win32錛?6浣?br>0x00004E2D 0x00006587 0x00000061 0x00000062 0x00000063 //Linux錛?2浣?br>澶у啓鐨凩鏄憡璇夌紪璇戝櫒錛氳繖鏄瀛楃涓層傛墍浠ワ紝榪欐椂鍊欐槸闇瑕佺紪璇戝櫒鏍規(guī)嵁locale鏉ヨ繘琛岀炕璇戠殑銆?br>姣斿錛屽湪Windows鐜涓紝緙栬瘧鍣ㄧ殑緲昏瘧絳栫暐鏄疓B2312鍒癠CS-2BE錛汱inux鐜涓殑絳栫暐鏄疷TF-8鍒癠TF-32BE銆?br>榪欐椂鍊欏氨瑕佹眰婧愭枃浠剁殑緙栫爜涓庣紪璇戝櫒鐨勬湰鍦板寲絳栫暐闆嗕腑浠g爜緲昏瘧鐨勭瓥鐣ヤ竴鑷達紝渚嬪VC鍙兘璇誨彇GB2312鐨勬簮浠g爜錛堣繖閲岃繕鏄緥澶栵紝VC澶嚜浣滆仾鏄庝簡 錛屼細灝嗗緢澶氬叾浠栦唬鐮佸湪緙栬瘧鏃惰嚜鍔ㄨ漿鎹㈡垚GB2312錛夛紝鑰実cc鍙兘璇誨彇UTF-8鐨勬簮浠g爜錛堣繖閲屽氨鏈変釜灝村艾錛孧inGW榪愯win32涓嬶紝鎵浠ュ彧鏈塆B2312緋葷粺鎵嶈錛涜孧inGW鍗寸敤gcc緙栧啓錛屾墍浠ヨ嚜宸卞彧璁TF-8錛屾墍浠ョ粨鏋滃氨鏄紝MinGW鐨勫瀛楃琚簾鎺変簡錛夈?br>瀹藉瓧絎︼紙涓詫級鐢辯紪璇戝櫒緲昏瘧錛岃繕鏄紜紪鐮佽繘紼嬪簭鏂囦歡涓?
]]>
#include <vector>
using std::cout;
using std::cin;
using std::endl;
using std::vector;
int main(int argc, char* argv[])
{
const int MAX = 10;
vector<int> v;
for (int i = 0; i < MAX; i++) {
v.push_back(i);
cout << v[i] << '\t';
}
int ers = -1;
while ( ers < 0 || ers >= MAX) {
cout << "Erase No.";
cin >> ers;
}
for (vector<int>::const_iterator i = v.begin(); i != v.end(); i++) {
if (*i == ers) {
v.erase(i);
}
}
for (vector<int>::const_iterator i = v.begin(); i != v.end(); i++) {
cout << *i << '\t';
}
cout << endl;
return 0;
}
#include <vector>
using std::cout;
using std::cin;
using std::endl;
using std::vector;
int main(int argc, char* argv[])
{
const int MAX = 10;
vector<int> v;
for (int i = 0; i < MAX; i++) {
v.push_back(i);
cout << v[i] << '\t';
}
int ers = -1;
while ( ers < 0 || ers >= MAX) {
cout << "Erase No.";
cin >> ers;
}
vector<int>::const_iterator ers_i;
for (vector<int>::const_iterator i = v.begin(); i != v.end(); i++) {
if (*i == ers) {
ers_i = i;
}
}
v.erase(ers_i);
for (vector<int>::const_iterator i = v.begin(); i != v.end(); i++) {
cout << *i << '\t';
}
cout << endl;
return 0;
}
]]>
#include "windows.h"
class TestClass1{
private:
int x;
public:
explicit TestClass1(int to_x):x(to_x)
{}
~TestClass1()
{
std::cerr << "destruction: 1." << std::endl;
}
void show() const
{
std::cerr << x << std::endl;
}
};
class TestClass2{
private:
int* pX;
public:
explicit TestClass2(int to_x)
{
pX = new int;
*pX = to_x;
}
~TestClass2()
{
delete pX;
std::cerr << "destruction: 2." << std::endl;
}
const int& value() const
{
return *pX;
}
};
DWORD WINAPI thread_func(LPVOID pN)
{
Sleep(200);
TestClass1 test((*((TestClass2*)pN)).value());
test.show();
return 0;
}
int main(int argc, char* argv[])
{
for (int i = 0; i < 3; ++i) {
TestClass2 n(5);
thread_func((LPVOID)&n);
std::cerr << "loop: " << i+1 << std::endl;
}
Sleep(2000);
std::cout << "main() ok." << std::endl;
return 0;
}
destruction: 1.
loop: 1
destruction: 2.
5
destruction: 1.
loop: 2
destruction: 2.
5
destruction: 1.
loop: 3
destruction: 2.
main() ok.
璇鋒寜浠繪剰閿戶緇? . .
#include "windows.h"
class TestClass1{
private:
int x;
public:
explicit TestClass1(int to_x):x(to_x)
{}
~TestClass1()
{
std::cerr << "destruction: 1." << std::endl;
}
void show() const
{
std::cerr << x << std::endl;
}
};
class TestClass2{
private:
int* pX;
public:
explicit TestClass2(int to_x)
{
pX = new int;
*pX = to_x;
}
~TestClass2()
{
delete pX;
std::cerr << "destruction: 2." << std::endl;
}
const int& value() const
{
return *pX;
}
};
DWORD WINAPI thread_func(LPVOID pN)
{
Sleep(200);
TestClass1 test((*((TestClass2*)pN)).value());
test.show();
return 0;
}
int main(int argc, char* argv[])
{
for (int i = 0; i < 3; ++i) {
TestClass2 n(5);
HANDLE hThrd;
DWORD thrdId;
hThrd = CreateThread( NULL,
0,
thread_func,
(LPVOID)&n,
0,
&thrdId);
std::cerr << "loop: " << i+1 << std::endl;
}
Sleep(2000);
std::cout << "main() ok." << std::endl;
return 0;
}
destruction: 2.
loop: 2
destruction: 2.
loop: 3
destruction: 2.
36
destruction: 1.
36
destruction: 1.
36
destruction: 1.
main() ok.
璇鋒寜浠繪剰閿戶緇? . .
]]>
#include <windows.h>
DWORD WINAPI thread_func(LPVOID pN)
{
for (int i = 0; i < *((int*)pN); ++i) {
std::cout << i+1 << "\t";
}
std::cout << std::endl;
throw "ok.";
std::cout << "thread_func() done." << std::endl;
return 0;
}
int main(int argc, char* argv[])
{
int n = 5;
try{
thread_func((LPVOID)&n);
Sleep(2000);
}
catch (const char* s) {
std::cerr << s << std::endl;
exit(1);
}
std::cout << "main() done." << std::endl;
return 0;
}
#include <windows.h>
DWORD WINAPI thread_func(LPVOID pN)
{
for (int i = 0; i < *((int*)pN); ++i) {
std::cout << i+1 << "\t";
}
std::cout << std::endl;
throw "ok.";
std::cout << "thread_func() done." << std::endl;
return 0;
}
int main(int argc, char* argv[])
{
HANDLE hThrd;
DWORD thrdId;
int n = 5;
try{
hThrd = CreateThread( NULL,
0,
thread_func,
(LPVOID)&n,
0,
&thrdId);
Sleep(2000);
}
catch (const char* s) {
std::cerr << s << std::endl;
exit(1);
}
std::cout << "main() done." << std::endl;
return 0;
}
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
璇鋒寜浠繪剰閿戶緇? . .
#include <windows.h>
DWORD WINAPI thread_func(LPVOID pN)
{
try{
for (int i = 0; i < *((int*)pN); ++i) {
std::cout << i+1 << "\t";
}
std::cout << std::endl;
throw "ok.";
}
catch (const char* s) {
std::cerr << s << std::endl;
exit(1);
}
std::cout << "thread_func() done." << std::endl;
return 0;
}
int main(int argc, char* argv[])
{
HANDLE hThrd;
DWORD thrdId;
int n = 5;
hThrd = CreateThread( NULL,
0,
thread_func,
(LPVOID)&n,
0,
&thrdId);
Sleep(2000);
std::cout << "main() done." << std::endl;
return 0;
}
]]>
class A
{
private:
int a;
public:
A(int _a): a(_a)
{}
void f1() const
{
std::cout << "call f1, a = " << a << std::endl;
}
int f2() const
{
std::cout << "call f2, a = " << a << std::endl;
return 0;
}
static void f3(const A& _a)
{
std::cout << "call f3, ";
_a.f1();
}
friend void f4(const A& _a)
{
std::cout << "call f4, a = " << _a.a << std::endl;
}
};
鎴戜滑鎶婂墿涓嬬殑紼嬪簭琛ュ厖瀹屾暣錛?br>
{
(_a.*pF)();
}
void call_A(pf pF, const A& _a)
{
(*pF)(_a);
}
int main(int argc, char* argv[])
{
A a(10);
call_A(&A::f1, a);
ptf __f2 = &A::f2;
pcf _f2 = (pcf)(__f2);
call_A(_f2, a);
call_A(A::f3, a);
call_A(f4, a);
return 0;
}
]]>
鍏舵錛屾垜浠彲浠ユ妸瀹冨畾涔変負A瀵硅薄鐨勫紩鐢細A& a_obj; 鎴栬卌onst寮曠敤錛歝onst A& a_obj;
鍐嶈咃紝鎴戜滑榪樺彲浠ユ妸瀹冨畾涔変負A瀵硅薄鐨勬寚閽堬細A* pA_obj; 鎴栬卌onst瀵硅薄鐨勬寚閽堬細const A* pA_obj;
褰撴垜浠洿鎺ヤ嬌鐢ˋ瀵硅薄鐨勬椂鍊欙紝a_obj浼氬湪B瀵硅薄寤虹珛鐨勬椂鍊欏緩绔嬶紝鍦˙閿姣佺殑鏃跺欓攢姣併傚洜涓鴻繖鏄竴涓柊寤虹珛鐨勫璞★紝鎵浠ュ湪鎴愬憳鍒濆鍖栫殑鏃跺欐槸鐪熸鏋勯犱簡瀵硅薄錛屽嵆鎴戜滑鍓嶉潰璇村埌鐨勪嬌鐢ㄤ簡澶嶅埗鏋勯犲嚱鏁般?br> 濡傛灉浣跨敤鐨勬槸A瀵硅薄鐨勫紩鐢ㄦ垨鑰呮寚閽堬紝a_obj錛堟垨pA_obj錛夐兘娌℃湁鏋勯犳柊鐨勫璞°傛垜浠亣璁綛鐨勪竴涓瀯閫犲嚱鏁版槸榪欐牱鐨勶細B(const A& a_obj): a_obj(a_obj) {}錛岄偅涔堟鏃犵枒闂紝榪欎釜鏋勯犲嚱鏁版槸鑳芥甯稿伐浣滅殑錛屼篃灝辨槸璇達紝鎴戜滑鐢ㄧ幇鎴愮殑瀵硅薄錛屾垨鑰呰鏄湪B瀵硅薄鐢熷懡鍛ㄦ湡鍐呴兘浼氫竴鐩村瓨鍦ㄧ殑A瀵硅薄鍘繪瀯閫燘瀵硅薄鏄病鏈夐棶棰樼殑銆備絾鏄紝濡傛灉涓涓瀯閫犲嚱鏁版槸榪欐牱鐨勶細B(int a): a_obj(A(a)) {}錛岃繖涓嚱鏁幫紝涓鑸湪緙栬瘧鐨勬椂鍊欐槸涓嶄細鎶ラ敊鎴栬呭彂鍑鴻鍛婄殑錛屼絾鏄垜浠垎鏋愪竴涓嬶紝A(a)鏄復鏃舵瀯閫犱簡涓涓狝瀵硅薄錛岀劧鍚巃_obj鎴愪負浜嗚繖涓復鏃跺璞$殑寮曠敤銆備絾鏄棶棰樻槸錛岃繖涓復鏃跺璞″湪B瀵硅薄鏋勯犱箣鍚庡氨椹笂閿姣佷簡錛屼篃灝辨槸璇達紝a_obj寮曠敤浜嗕竴涓笉瀛樺湪鐨勫璞★紙鎹㈠埌鎸囬拡璇村氨鏄寚鍚戜簡絀烘寚閽堬級銆傝繖鏄竴涓法澶х殑閿欒錛屽皢鍦ㄨ繍琛屾椂寮曞彂閿欒銆?br> 鎵浠ワ紝緇撹鏄細濡傛灉鎴愬憳鏁版嵁浣跨敤錛堟柊錛夊璞★紝鍒欏繀欏誨畾涔夎繖涓璞℃墍灞炵被鐨勫鍒舵瀯閫犲嚱鏁幫紱濡傛灉浣跨敤鐨勬槸瀵硅薄寮曠敤鎴栬呮寚閽堬紝鍒欎竴瀹氬彧鑳界敤宸茬粡瀛樺湪騫朵笖浼氬湪B瀵硅薄鏁翠釜鐢熷懡鍛ㄦ湡鍐呴兘瀛樺湪鐨凙瀵硅薄鏉ユ瀯閫犺繖涓狟瀵硅薄銆?br> 璇村緱璨屼技寰堝鏉傦紝鐣欎釜浣滀負渚嬪瓙鐨?涓被錛屽ぇ瀹跺彲浠ュ鍐欏嚑涓紨紺虹▼搴忚瘯璇曘?br>
#define A_HPP
#include <iostream>
using namespace std;
char* get_point(int lenth);
void free_point(char* temp);
class A
{
private:
//
protected:
char* temp;
int lenth;
A();
public:
A(const A& copy);
~A();
void show() const;
};
class C: public A
{
public:
C(int _lenth);
~C();
};
class B
{
private:
A b;
public:
B(const A& a);
B(int _lenth);
~B();
void show() const;
};
#endif
A::A(): temp(0),lenth(0)
{
cout<< "A Constructor!" << endl;
}
A::A(const A& copy): lenth(copy.lenth)
{
temp = get_point(lenth);
cout << "A Copy Constructor" << endl;
cout << "temp at: " << int(temp) << endl;
}
A::~A()
{
cout << "temp at: " << int(temp) << endl;
free_point(temp);
cout << "Heap Deleted!\n";
cout << "A Destroyed!" << endl;
}
void A::show() const
{
cout << temp << endl;
}
//***************************************
C::C(int _lenth): A()
{
lenth = _lenth;
temp = get_point(lenth);
cout<< "C Constructor!" << endl;
cout << "temp at: " << int(temp) << endl;
}
C::~C()
{
cout << "C Destroyed!" << endl;
}
//***************************************
B::B(const A& a): b(a)
{
cout<< "B Constructor!" << endl;
}
B::B(int _lenth): b(C(_lenth))
{
cout<< "B Constructor!" << endl;
}
B::~B()
{
cout << "B Destroyed!" << endl;
}
void B::show() const
{
b.show();
}
//************************************
char* get_point(int lenth)
{
char* temp = new char[lenth+1];
for ( int i = 0; i< lenth; i++ )
temp[i] = '*';
temp[lenth] = '\0';
cout << "New buffer got!\n";
return temp;
}
void free_point(char* temp)
{
delete []temp;
cout << "Buffer deleted!\n";
}
]]>
#include <vector>
class A
{
private:
int a;
public:
A(int _a): a(_a)
{
std::cout << "A created!\n";
}
/*
A(const A& copy): a(copy.a)
{
std::cout << "A copy created!\n";
}
*/
~A()
{
std::cout << "A destroyed!\n";
}
void show() const
{
std::cout << a << std::endl;
}
};
int main(int argc, char* argv[])
{
A a(1);
A b(a);
return 0;
}
]]>
//鏄懼紡璋冪敤鐨勬椂鍊欙紝鏋愭瀯鍑芥暟鐩稿綋浜庣殑涓涓櫘閫氱殑鎴愬憳鍑芥暟
//緙栬瘧鍣ㄩ殣寮忚皟鐢ㄦ瀽鏋勫嚱鏁幫紝濡傚垎閰嶄簡瀵瑰唴瀛橈紝鏄懼紡璋冪敤鏋愭瀯鐨勮瘽寮曡搗閲嶅閲婃斁鍫嗗唴瀛樼殑寮傚父
//鎶婁竴涓璞$湅浣滃崰鐢ㄤ簡閮ㄥ垎鏍堝唴瀛橈紝鍗犵敤浜嗛儴鍒嗗爢鍐呭瓨錛堝鏋滅敵璇蜂簡鐨勮瘽錛夛紝榪欐牱渚夸簬鐞嗚В榪欎釜闂
//緋葷粺闅愬紡璋冪敤鏋愭瀯鍑芥暟鐨勬椂鍊欙紝浼氬姞鍏ラ噴鏀炬爤鍐呭瓨鐨勫姩浣滐紙鑰屽爢鍐呭瓨鍒欑敱鐢ㄦ埛鎵嬪伐鐨勯噴鏀撅級
//鐢ㄦ埛鏄懼紡璋冪敤鏋愭瀯鍑芥暟鐨勬椂鍊欙紝鍙槸鍗曠函鎵ц鏋愭瀯鍑芥暟鍐呯殑璇彞錛屼笉浼氶噴鏀炬爤鍐呭瓨錛屾懅姣佸璞?/span>
緋葷粺鍦ㄤ粈涔堟儏鍐典笅涓嶄細鑷姩璋冪敤鏋愭瀯鍑芥暟鍛紵鏄劇劧錛屽鏋滃璞¤寤虹珛鍦ㄥ爢涓婏紝緋葷粺灝變笉浼氳嚜鍔ㄨ皟鐢ㄣ備竴涓父瑙佺殑渚嬪瓙鏄痭ew...delete緇勫悎銆備絾鏄ソ鍦ㄨ皟鐢╠elete鐨勬椂鍊欙紝鏋愭瀯鍑芥暟榪樻槸琚嚜鍔ㄨ皟鐢ㄤ簡銆傚緢緗曡鐨勪緥澶栧湪浜庝嬌鐢ㄥ竷灞new鐨勬椂鍊欙紝鍦╠elete璁劇疆鐨勭紦瀛樹箣鍓嶏紝闇瑕佹樉寮忚皟鐢ㄧ殑鏋愭瀯鍑芥暟錛岃繖瀹炲湪鏄緢灝戣鐨勬儏鍐點?br> 鎵浠ワ紝緇撹鏄紝涓鑸笉瑕佽嚜浣滆仾鏄庣殑鍘昏皟鐢ㄦ瀽鏋勫嚱鏁般傛垨鑰呰鏄綘涓嶅珜楹葷儲鐨勮瘽錛屾瀽鏋勪箣鍓嶆渶濂藉厛鐪嬬湅鍫嗕笂鐨勬暟鎹槸涓嶆槸宸茬粡琚噴鏀捐繃浜嗐傛斁鍑轟竴涓紨紺虹殑渚嬪瓙錛屽ぇ瀹跺彲浠ュ弬鑰冧竴涓嬪搱銆?/p>
#define A_HPP
#include <iostream>
using namespace std;
class A
{
private:
int a;
int* temp;
bool heap_deleted;
public:
A(int _a);
A(const A& _a);
~A();
void change(int x);
void show() const;
};
#endif
A::A(int _a): heap_deleted(false)
{
temp = new int;
*temp = _a;
a = *temp;
cout<< "A Constructor!" << endl;
}
A::A(const A& _a): heap_deleted(false)
{
temp = new int;
*temp = _a.a;
a = *temp;
cout << "A Copy Constructor" << endl;
}
A::~A()
{
if ( heap_deleted == false){
cout << "temp at: " << temp << endl;
delete temp;
heap_deleted = true;
cout << "Heap Deleted!\n";
}
else {
cout << "Heap already Deleted!\n";
}
cout << "A Destroyed!" << endl;
}
void A::change(int x)
{
a = x;
}
void A::show() const
{
cout << "a = " << a << endl;
}
int main(int argc, char* argv[])
{
A a(1);
a.~A();
a.show();
cout << "main() end\n";
a.change(2);
a.show();
return 0;
}
]]>
鎴戜笅闈㈣冭檻鐨勯棶棰橈紝鏄敤TextSurface鍙嶉榧犳爣浜嬩歡鐨勪俊鎭傛垜鎯沖埌鐨勭涓涓緥瀛愶紝寰堣嚜鐒跺氨鏄弽棣堥紶鏍囨墍鍦ㄥ潗鏍囩殑浣嶇疆銆傝繖閲屾秹鍙婂埌涓涓熀紜鐨勯棶棰橈紝鍗抽紶鏍囦綅緗樉鐒朵笉鏄敤瀛楃涓茶〃紺虹殑銆係DL緇欐垜浠殑鍙嶉淇℃伅鏄痠nt錛屾垜浠渶瑕佺敤TextSurface灝唅nt鏋勫緩鎴愬彲浠ヨblit鍒癝creenSurface涓婄殑闈紝闇瑕佸仛鐨勭涓浠朵簨鎯咃紝鏄皢int杞崲涓簊tring銆?br> 鎴戠殑鎬濊礬鏄繖鏍風殑錛氶鍏堟壘鍒癷nt鐨勬暟浣嶆暟錛涚劧鍚庝緷嬈′粠楂樹綅璇誨彇鏁板瓧錛屼箣鍚庡皢榪欎釜浣嶅幓鎺夛紙閫氬父鍑忔帀鏄渶綆鍗曠殑錛夛紱渚濇璁板綍榪欎簺鏁板瓧錛岃漿鎹㈡垚string錛岀劧鍚庡皢榪欎簺鏁板瓧“鍔?#8221;錛堝瓧絎︿覆鐨勫悎騫訛級璧鋒潵銆?br>澶存枃浠跺涓嬶細
//Long Fei (lf426), E-mail: zbln426@163.com
//FileName: int_to_string.h
#ifndef INT_TO_STRING_H_
#define INT_TO_STRING_H_
#include <iostream>
#include <string>
#include <vector>
int int_power(int base, int exp);
std::string int_to_string(int num);
#endif
//Long Fei (lf426), E-mail: zbln426@163.com
#include "int_to_string.h"
int int_power(int base, int exp)
{
int result = 1;
for (int i = exp; i > 0; i-- )
result*=base;
return result;
}
{
bool negative = false;
if ( num < 0 ){
negative = true;
num = -num;
}
for ( int i = num; i > 9; i/=10 )
bitNum++;
for ( int i = bitNum, temp = num; i > 0; i-- ){
int highBit = int(temp/int_power(10, (i-1)));
eachNum.push_back(highBit);
temp-=(highBit*int_power(10, (i-1)));
}
if ( negative == true )
str = "-";
for ( std::vector<int>::iterator pTemp = eachNum.begin(); pTemp != eachNum.end(); pTemp++ ){
switch ( *pTemp ){
case 0:
str+="0";
break;
case 1:
str+="1";
break;
case 2:
str+="2";
break;
case 3:
str+="3";
break;
case 4:
str+="4";
break;
case 5:
str+="5";
break;
case 6:
str+="6";
break;
case 7:
str+="7";
break;
case 8:
str+="8";
break;
case 9:
str+="9";
break;
default:
break;
}
}
return str;
}
]]>
#define AGGREGATE_H_
#include <iostream>
#include <vector>
#include <algorithm>
class Aggregate
{
private:
std::vector<int> agg;
public:
Aggregate(std::vector<int>& temp);
const std::vector<int> getAgg() const;
};
#endif
Aggregate::Aggregate(std::vector<int>& temp)
{
for ( std::vector<int>::iterator pTemp = temp.begin(); pTemp != temp.end(); pTemp++ ) {
bool findSame = false;
for ( std::vector<int>::iterator pAgg = agg.begin(); pAgg != agg.end(); pAgg++ )
if ( *pTemp == *pAgg )
findSame = true;
if ( findSame == false )
agg.push_back(*pTemp);
}
}
const std::vector<int> Aggregate::getAgg() const
{
return agg;
}
void show(int& i);
int main(int argc, char* argv[])
{
std::vector<int> tempArray;
int temp;
bool goon = true;
while ( goon == true ) {
std::cout << "#" << tempArray.size()+1 << "= ";
std::cin >> temp;
if ( temp == -1 ) {
goon = false;
continue;
}
tempArray.push_back(temp);
}
std::cout << "You've entered " << tempArray.size() << " numbers." << std::endl;
for_each(tempArray.begin(), tempArray.end(), show);
std::cout << "----------------------------\n" << "Now, to be aggregate\n";
Aggregate tempAgg (tempArray);
std::cout << "There are " << tempAgg.getAgg().size() << " different numbers.\n";
for_each(tempAgg.getAgg().begin(), tempAgg.getAgg().end(), show);
return 0;
}
void show(int& i)
{
std::cout << i << std::endl;
}
\n";
Aggregate tempAgg (tempArray);
std::vector<int> tempAggArray = tempAgg.getAgg();
std::cout << "There are " << tempAggArray.size() << " different numbers.\n";
for_each(tempAggArray.begin(), tempAggArray.end(), show);
璁╅敊璇鍙戠幇鍦ㄧ紪璇戦樁孌碉紝榪滆繙濂戒簬琚彂鐜板湪榪愯鏃墮樁孌點傛垜鎯籌紝榪欏氨鏄疌++涓璫onst鏈澶х殑浣滅敤銆傛墍浠ワ紝鎬葷粨璧鋒潵榪樻槸C++鐨勪竴鍙ヨ瘽錛岃兘const錛屽氨const鍚с?)
]]>