锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
http://loih.blog.163.com/
2013騫?0鏈?0鏃ユ洿鏂癓oih Beta 0.11a Team Mode
錛堝洟闃熸ā寮忥紝鏀寔5v5錛?br />Loih Beta 0.11a Team Mode
2013騫?鏈?9鏃ユ洿鏂癓oih Beta 0.11a
錛堝寘鎷?#8220;鏍囧噯瀵規垬鐗?#8221;鍜?#8220;甯﹂噹鎬増”錛?br />Loih Beta 0.11a
钀藉焹鐢熷瓨鎴橈紙鍩轟簬Loih 0.07錛屽甫AI錛?br />钀藉焹鐢熷瓨鎴樹笅杞?/a>
钀藉焹錛氭棤鏁岃嫳闆勪紶璇?Beta 0.09e
鏍囧噯瀵規垬鐗?.09e
钀藉焹錛氭棤鏁岃嫳闆勪紶璇?Beta 0.10b
鏍囧噯瀵規垬鐗?.10b
]]>
紜紪鐮佺殑紜激
鎴戜滑鐜板湪鐭ラ亾錛孋/C++鐨勫紿勮漿鎹㈡槸渚濊禆緋葷粺鐨刲ocale鐨勶紝騫朵笖鍦ㄨ繍琛屾椂瀹屾垚銆傝冭檻榪欐牱涓縐嶆儏鍐碉紝鎴戜滑鍦ㄧ畝浣撲腑鏂嘩indows涓嬬紪璇戝涓嬭鍙ワ細
const char* s = "涓枃abc";
鏍規嵁鎴戜滑涔嬪墠鐨勮璁猴紝緙栬瘧鍣ㄥ皢鎸夌収Windows Codepage936錛圙B2312錛夊榪欎釜瀛楃涓茶繘琛岀紪鐮併傚鏋滄垜浠湪紼嬪簭涓繍琛屽紿勮漿鎹㈠嚱鏁幫紝灝唖杞崲涓哄瀛楃涓瞱s錛屽鏋滆繖涓▼搴忚繍琛屽湪綆浣撲腑鏂囩幆澧冧笅鏄病闂鐨勶紝灝嗘墽琛屼粠GB2312鍒癠CS-2BE鐨勮漿鎹紱浣嗘槸錛屽鏋滃湪鍏朵粬璇█鐜涓嬶紝姣斿鏄箒浣撲腑鏂嘊IG5錛岀▼搴忓皢鏍規嵁緋葷粺鐨刲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璁╁浗闄呭寲鐨勭炕璇戞洿鍔犵殑鏂逛究錛岀己鐐規槸鐩墠鎴戞病鎵懼埌鏀寔瀹藉瓧絎︿覆鐨勭増鏈紙鎹鏄湁ugettext()鏀寔瀹藉瓧絎︿覆錛夛紝鎵浠ヨ浣跨敤gettext鍙兘浣跨敤紿勫瓧絎︿覆銆備絾鏄痝ettext鍙互杞崲鍒板瀛楃涓詫紝鑰屼笖涓嶄細鍑虹幇瀹界獎杞崲鐨勯棶棰橈紝鍥犱負gettext鏄繍琛屾椂鏍規嵁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涓坊鍔犺繖涓姛鑳藉氨鍙互浜嗐傝璧鋒潵瀹規槗錛屽疄闄呬笂鏄渶瑕侀噸鏂版敼閫犱竴涓猄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榪欎釜璇嶇敤寰楁瘮杈冨鐨勫師鍥犲彲鑳芥槸鍥犱負姣旇緝瀹規槗璁頒綇錛屽鏋滄病鏈夌壒鍒殑澹版槑錛屽湪鏈枃鎵鎻愬強鐨刄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鍦ㄨ綆楁満涓殑緙栫爜鏂規硶鍑虹幇浜嗭紝榪欏氨鏄疷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涔熷氨絳変環浜嶶CS-2BE
BOM
涓轟簡璇存槑涓涓枃浠墮噰鐢ㄧ殑鏄粈涔堢紪鐮侊紝鍦ㄦ枃浠舵渶寮濮嬬殑閮ㄥ垎錛屽彲浠ユ湁BOM錛屾瘮濡?xFE 0xFF琛ㄧずUTF-16BE錛?xFF 0xFE 0x00 0x00琛ㄧずUTF-32LE銆俇TF-8鍘熸湰鏄笉闇瑕丅OM鐨勶紝鍥犱負鍏惰嚜鎴戝悓姝ョ殑鐗規э紝浣嗘槸涓轟簡鏄庣‘璇存槑榪欐槸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>澶у啓鐨凩鏄憡璇夌紪璇戝櫒錛氳繖鏄瀛楃涓層傛墍浠ワ紝榪欐椂鍊欐槸闇瑕佺紪璇戝櫒鏍規嵁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>瀹藉瓧絎︼紙涓詫級鐢辯紪璇戝櫒緲昏瘧錛岃繕鏄紜紪鐮佽繘紼嬪簭鏂囦歡涓?
]]>
public:
explicit UDPEchoClient(
int pre_buffer_size = 32);
~UDPEchoClient();
bool doEcho(const std::string& echo_message);
};
int pre_buffer_size):
UDPClientSock(pre_buffer_size)
{}
UDPEchoClient::~UDPEchoClient()
{}
bool UDPEchoClient::doEcho(const std::string& echo_message)
{
if ( UDPSendtoDest(echo_message.data(), echo_message.size()) < 0) {
return false;
}
if (echo_message == "/shutdown") {
return false;
}
if (UDPReceive() < 0) {
return false;
}
std::cout.write(preBuffer, preReceivedLength);
std::cout << std::endl;
return true;
}
{
unsigned short server_port = 5000;
if (argc == 3 && atoi(argv[2]) > 0) {
server_port = atoi(argv[2]);
}
WinsockAPI winsockInfo;
winsockInfo.showVersion();
UDPEchoClient echo_client;
echo_client.UDPSetDest(argv[1], server_port);
std::string msg;
bool go_on = true;
while (msg != "/exit" && go_on){
std::cout << "Echo: ";
std::getline(std::cin, msg);
go_on = echo_client.doEcho(msg);
}
return 0;
}
Linux錛?br>http://www.163pan.com/files/c0l000h0t.html
win32錛?br>http://www.163pan.com/files/c0o000h09.html
]]>
public:
explicit UDPEchoServer(
unsigned short server_port,
int pre_buffer_size = 32);
~UDPEchoServer();
bool handEcho();
};
unsigned short server_port,
int pre_buffer_size):
UDPServerSock(server_port, pre_buffer_size)
{}
UDPEchoServer::~UDPEchoServer()
{}
bool UDPEchoServer::handEcho()
{
const std::string SHUTDOWN_CMD = "/shutdown";
while (UDPReceive() >= 0) {
std::string cmd(preBuffer, SHUTDOWN_CMD.size());
if (cmd == SHUTDOWN_CMD &&
preReceivedLength == static_cast<int>(SHUTDOWN_CMD.size())) {
return false;
}
std::cout << "Client ( "
<< inet_ntoa(lastfromSockAddr.sin_addr)
<< " : "
<< ntohs(lastfromSockAddr.sin_port)
<< " ) sent a message."
<< std::endl;
UDPSetDest(lastfromSockAddr);
UDPSendtoDest(preBuffer, preReceivedLength);
}
return true;
}
{
const unsigned short DEFAULT_PORT = 5000;
unsigned short server_port = DEFAULT_PORT;
if (argc == 2 && atoi(argv[1]) > 0) {
server_port = atoi(argv[1]);
}
UDPEchoServer echo_server(server_port);
bool go_on = true;
while (go_on){
go_on = echo_server.handEcho();
}
return 0;
}
Linux錛?br>http://www.163pan.com/files/c0l000h0s.html
win32錛?br>http://www.163pan.com/files/c0o000h08.html
]]>
#include <sys/socket.h>
ssize_t recv(int s, void *buf, size_t len, int flags);
ssize_t recvfrom(int s, void *buf, size_t len, int flags,
struct sockaddr *from, socklen_t *fromlen);
]]>