string KorCodeChg(const string& sSrc, ENCODING eEncode) { #ifndef HAVE_ICONV return sSrc; #endif ENCODING tSrcEncode; string sChgCode = isKorCode(sSrc, &tSrcEncode); if ( tSrcEncode == US ) return sSrc; if ( eEncode == KO_EUCKR ) { if (tSrcEncode == KO_UTF8 && e_nCurLang == KO_UTF8 ) { return CodeConvert(sChgCode, "EUC-KR", "UTF-8"); } if (tSrcEncode == KO_EUCKR) return sSrc; return sChgCode; } else if ( eEncode == KO_UTF8 ) { if (tSrcEncode == KO_EUCKR && e_nCurLang == KO_EUCKR ) return CodeConvert(sChgCode, "UTF-8", "EUC-KR"); if (tSrcEncode == KO_UTF8) return sSrc; return sChgCode; } return sSrc; }
/// @brief 영문과 한글을 자동으로 보여주기 위한 함수. /// @param sEnglish 영문 /// @param sKorean 영문에 대응한 한글 내용 /// @return 언어 설정에 따라 영어 아니면 한글 메시지를 반환한다. string ChgEngKor(const string& sEnglish, const string& sKorean) { #ifndef HAVE_ICONV return sEnglish; #endif if (e_nCurLang == KO_EUCKR) return CodeConvert(sKorean, "EUC-KR", "UTF-8"); else if (e_nCurLang == KO_UTF8) return sKorean; else return sEnglish; }
void CAppCtrl::AcceptReq(CBuffer& stBuff, int iLen) { if(m_bExit) //停止了服務,這不處理客戶端信息 { return; } //把數據解析出來 CNetHead& stHead = *(CNetHead*)stBuff.GetUsedBuf(); if(iLen != (int)sizeof(CNetHead) + stHead.m_iDataLength) //長度不一致 { SL_WARNING("code length invalid. %d != %d + %d",iLen, sizeof(CNetHead), stHead.m_iDataLength); return; } CCodeStream s; CMsgHead stMsgHead; //斷線判斷 if((stHead.m_LiveFlag && 0xFF) != 0) { SL_TRACE("user(%u) offline, liveflag = %x, handle = %d!",stHead.m_Act1, stHead.m_LiveFlag, stHead.m_Handle); SetOfflining(stHead); return; } int iRet = s.Attach(stBuff.GetUsedBuf() + sizeof(CNetHead), stHead.m_iDataLength); if(iRet) { SL_TRACE("Attach failed!"); return; } s.InitConvert(); iRet = CodeConvert(s, stMsgHead, NULL, bin_decode()); if(iRet) { SL_TRACE("CodeConvert iRet = %d!", iRet); return; } //檢查消息合法性 bool bIsAdmin = IsFromAdminPort(stHead); if(!bIsAdmin && IsAdminMsg(stMsgHead.m_shMsgID)) { //如果是從非管理端口來的管理消息則直接忽略掉 SL_WARNING("user (%llu) send admin msg(%u) but no admin", static_cast<sl::uid_t>(stHead.m_Act1), stMsgHead.m_shMsgID); return; } //慢處理的檢測 SL_TRACE("get commend from user(%llu), cmd id = (%d)", stHead.m_Act1, stMsgHead.m_shMsgID); sl::uint iNowTime = static_cast<sl::uint>(time(0)); if(iNowTime - stHead.m_LastTime >= 2) { m_Stat.Put(app_stat_waittimeout); SL_WARNING("user(%llu) cmd(%d) act(%d) waited more than 2 sec!", stHead.m_Act1, stMsgHead.m_shMsgID, stMsgHead.m_llMsgAct); } //創建并執行異步命令 CAsyncCmdInf* pstCmd = SL_CMDFACTORY->CreateCmd(stMsgHead.m_shMsgID); if(pstCmd == NULL) { //創建命令失敗 SL_WARNING("create cmd(%d) fails", stMsgHead.m_shMsgID); return; } CCmdDoParam stPara(stHead, stMsgHead, s, bIsAdmin); pstCmd->Do((void*)&stPara); }
/// @brief 현재 사용하는 코드로 바꿔준다. US 면 utf-8로 바꾼다. /// @param sSrc 문자열 /// @param eEncode 리턴 현재 인코드 /// @return 바꾼 문자열 string isKorCode(const string& sSrc, ENCODING* eEncode) { string sCodeConvertStr; string strData1, strData2; if (eEncode != NULL) *eEncode = US; if (sSrc == "") return ""; bool bUS = true; #ifndef __CYGWIN_C__ wstring wstr = strtowstr(sSrc); if (wstr.size() != 0) { for (int n = 0; n < (int)wstr.size(); n++) { if (wstr[n] > 0x80) { bUS = false; break; } } if (bUS == true) { if (eEncode != NULL) *eEncode = US; return sSrc; } } #else unsigned char cData; if (sSrc.size() != 0) { for (int n = 0; n < (int)sSrc.size(); n++) { cData = sSrc[n]; if (cData > 0x0080) { bUS = false; break; } } if (bUS == true) { if (eEncode != NULL) *eEncode = US; return sSrc; } } #endif if (e_nCurLang == KO_EUCKR) { #ifndef HAVE_ICONV sCodeConvertStr = sSrc; if (eEncode != NULL) *eEncode = KO_EUCKR; return sCodeConvertStr; #endif // EUCKR 로 본다. strData1 = CodeConvert(sSrc, "UTF-8", "EUC-KR"); // UTF8 로 바꿔봄. if ( strData1 == "" ) { // 현재 : UTF8 strData1 = CodeConvert(sSrc, "EUC-KR", "UTF-8"); // EUCKR 로 바꿔봄. strData2 = CodeConvert(strData1, "UTF-8", "EUC-KR"); // UTF8 로 바꿔봄. if ( strData1 != "" && sSrc == strData2 ) { if (eEncode != NULL) *eEncode = KO_UTF8; return strData1; } } else { strData2 = CodeConvert(strData1, "EUC-KR", "UTF-8"); // EUCKR 로 바꿔봄. if ( sSrc == strData2 ) { if (eEncode != NULL) *eEncode = KO_EUCKR; return sSrc; // UTF8 } } } else // 나머지는 utf-8로 바꿈. { #ifndef HAVE_ICONV sCodeConvertStr = sSrc; if (eEncode != NULL) *eEncode = KO_UTF8; return sCodeConvertStr; #endif // 현재 : UTF8 strData1 = CodeConvert(sSrc, "EUC-KR", "UTF-8"); // EUCKR 로 바꿔봄. if ( strData1 == "" ) { // EUCKR 로 본다. strData1 = CodeConvert(sSrc, "UTF-8", "EUC-KR"); // UTF8 로 바꿔봄. strData2 = CodeConvert(strData1, "EUC-KR", "UTF-8"); // EUCKR 로 바꿔봄. if ( strData1 != "" && sSrc == strData2 ) { if (eEncode != NULL) *eEncode = KO_EUCKR; return strData1; } } else { strData2 = CodeConvert(strData1, "UTF-8", "EUC-KR"); // UTF8 로 바꿔봄. if ( sSrc == strData2 ) { if (eEncode != NULL) *eEncode = KO_UTF8; return sSrc; // UTF8 } } } return sSrc; }