|
/*-----------------------------------------------------------------------------*/ // 代码页转换 & 简繁体转换 /*-----------------------------------------------------------------------------*/
typedef struct _tagWORD_CHAR { string strWord; string strChar; }WORD_CHAR;
typedef map< string, vector < WORD_CHAR > > WORD_MAP; typedef map< string, int > CHAR_MAP;
void SetNotNormalWordMap( WORD_MAP &_NotNormalWordMap ) { WORD_CHAR word_char;
word_char.strWord = "秋千"; word_char.strChar = "鞦"; _NotNormalWordMap[ "秋" ].push_back( word_char );
word_char.strWord = "秋千"; word_char.strChar = "韆"; _NotNormalWordMap[ "千" ].push_back( word_char );
word_char.strWord = "胡须"; word_char.strChar = "鬍"; _NotNormalWordMap[ "胡" ].push_back( word_char );
word_char.strWord = "回旋"; word_char.strChar = "迴"; _NotNormalWordMap[ "回" ].push_back( word_char );
word_char.strWord = "生姜"; word_char.strChar = "薑"; _NotNormalWordMap[ "姜" ].push_back( word_char );
word_char.strWord = "漓江"; word_char.strChar = "灕"; _NotNormalWordMap[ "漓" ].push_back( word_char );
// word_char.strWord = ""; // word_char.strChar = ""; // _NotNormalWordMap[ "" ].push_back( word_char ); }
// 非对称简繁体字 void SetNotNormalCharMap( CHAR_MAP &_NotNormalCharMap ) { int i = 1; _NotNormalCharMap[ "摆" ] = i++; _NotNormalCharMap[ "板" ] = i++; _NotNormalCharMap[ "辟" ] = i++; _NotNormalCharMap[ "表" ] = i++; _NotNormalCharMap[ "别" ] = i++; _NotNormalCharMap[ "卜" ] = i++; _NotNormalCharMap[ "才" ] = i++; _NotNormalCharMap[ "厂" ] = i++; _NotNormalCharMap[ "冲" ] = i++; _NotNormalCharMap[ "虫" ] = i++; _NotNormalCharMap[ "仇" ] = i++; _NotNormalCharMap[ "丑" ] = i++; _NotNormalCharMap[ "出" ] = i++; _NotNormalCharMap[ "担" ] = i++; _NotNormalCharMap[ "当" ] = i++; _NotNormalCharMap[ "党" ] = i++; _NotNormalCharMap[ "淀" ] = i++; _NotNormalCharMap[ "冬" ] = i++; _NotNormalCharMap[ "斗" ] = i++; _NotNormalCharMap[ "恶" ] = i++; _NotNormalCharMap[ "儿" ] = i++; _NotNormalCharMap[ "发" ] = i++; _NotNormalCharMap[ "范" ] = i++; _NotNormalCharMap[ "丰" ] = i++; _NotNormalCharMap[ "复" ] = i++; _NotNormalCharMap[ "干" ] = i++; _NotNormalCharMap[ "谷" ] = i++; _NotNormalCharMap[ "刮" ] = i++; _NotNormalCharMap[ "广" ] = i++; _NotNormalCharMap[ "柜" ] = i++; _NotNormalCharMap[ "合" ] = i++; _NotNormalCharMap[ "后" ] = i++; _NotNormalCharMap[ "胡" ] = i++; _NotNormalCharMap[ "划" ] = i++; _NotNormalCharMap[ "坏" ] = i++; _NotNormalCharMap[ "回" ] = i++; _NotNormalCharMap[ "汇" ] = i++; _NotNormalCharMap[ "伙" ] = i++; _NotNormalCharMap[ "获" ] = i++; _NotNormalCharMap[ "饥" ] = i++; _NotNormalCharMap[ "几" ] = i++; _NotNormalCharMap[ "家" ] = i++; _NotNormalCharMap[ "价" ] = i++; _NotNormalCharMap[ "姜" ] = i++; _NotNormalCharMap[ "借" ] = i++; _NotNormalCharMap[ "尽" ] = i++; _NotNormalCharMap[ "据" ] = i++; _NotNormalCharMap[ "卷" ] = i++; _NotNormalCharMap[ "克" ] = i++; _NotNormalCharMap[ "困" ] = i++; _NotNormalCharMap[ "腊" ] = i++; _NotNormalCharMap[ "蜡" ] = i++; _NotNormalCharMap[ "累" ] = i++; _NotNormalCharMap[ "漓" ] = i++; _NotNormalCharMap[ "里" ] = i++; _NotNormalCharMap[ "历" ] = i++; _NotNormalCharMap[ "帘" ] = i++; _NotNormalCharMap[ "了" ] = i++; _NotNormalCharMap[ "卤" ] = i++; _NotNormalCharMap[ "么" ] = i++; _NotNormalCharMap[ "霉" ] = i++; _NotNormalCharMap[ "蒙" ] = i++; _NotNormalCharMap[ "弥" ] = i++; _NotNormalCharMap[ "面" ] = i++; _NotNormalCharMap[ "蔑" ] = i++; _NotNormalCharMap[ "宁" ] = i++; _NotNormalCharMap[ "苹" ] = i++; _NotNormalCharMap[ "仆" ] = i++; _NotNormalCharMap[ "朴" ] = i++; _NotNormalCharMap[ "千" ] = i++; _NotNormalCharMap[ "签" ] = i++; _NotNormalCharMap[ "秋" ] = i++; _NotNormalCharMap[ "曲" ] = i++; _NotNormalCharMap[ "确" ] = i++; _NotNormalCharMap[ "舍" ] = i++; _NotNormalCharMap[ "沈" ] = i++; _NotNormalCharMap[ "胜" ] = i++; _NotNormalCharMap[ "适" ] = i++; _NotNormalCharMap[ "术" ] = i++; _NotNormalCharMap[ "松" ] = i++; _NotNormalCharMap[ "苏" ] = i++; _NotNormalCharMap[ "台" ] = i++; _NotNormalCharMap[ "坛" ] = i++; _NotNormalCharMap[ "体" ] = i++; _NotNormalCharMap[ "涂" ] = i++; _NotNormalCharMap[ "团" ] = i++; _NotNormalCharMap[ "万" ] = i++; _NotNormalCharMap[ "系" ] = i++; _NotNormalCharMap[ "纤" ] = i++; _NotNormalCharMap[ "咸" ] = i++; _NotNormalCharMap[ "向" ] = i++; _NotNormalCharMap[ "须" ] = i++; _NotNormalCharMap[ "旋" ] = i++; _NotNormalCharMap[ "药" ] = i++; _NotNormalCharMap[ "叶" ] = i++; _NotNormalCharMap[ "佣" ] = i++; _NotNormalCharMap[ "余" ] = i++; _NotNormalCharMap[ "与" ] = i++; _NotNormalCharMap[ "吁" ] = i++; _NotNormalCharMap[ "郁" ] = i++; _NotNormalCharMap[ "御" ] = i++; _NotNormalCharMap[ "愿" ] = i++; _NotNormalCharMap[ "云" ] = i++; _NotNormalCharMap[ "沄" ] = i++; _NotNormalCharMap[ "芸" ] = i++; _NotNormalCharMap[ "脏" ] = i++; _NotNormalCharMap[ "折" ] = i++; _NotNormalCharMap[ "征" ] = i++; _NotNormalCharMap[ "症" ] = i++; _NotNormalCharMap[ "只" ] = i++; _NotNormalCharMap[ "制" ] = i++; _NotNormalCharMap[ "致" ] = i++; _NotNormalCharMap[ "钟" ] = i++; _NotNormalCharMap[ "种" ] = i++; _NotNormalCharMap[ "朱" ] = i++; _NotNormalCharMap[ "筑" ] = i++; _NotNormalCharMap[ "准" ] = i++; }
// GB2312 --> GBK bool __fastcall GB2GBK(char *szBuf) { if( !strcmp(szBuf, "") ) return false;
int nStrLen = strlen(szBuf); DWORD wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC); int nReturn = LCMapString(wLCID, LCMAP_TRADITIONAL_CHINESE, szBuf, nStrLen, NULL, 0);
if( !nReturn ) return false;
char *pcBuf = new char[nReturn + 1];
wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC); LCMapString(wLCID, LCMAP_TRADITIONAL_CHINESE, szBuf, nReturn, pcBuf, nReturn + 1); strncpy(szBuf, pcBuf, nReturn);
delete[] pcBuf;
return true; }
// 代码页转换 CString CharCodeConvert( const CString str, int sourceCodepage, int targetCodepage) { int len=str.GetLength();
int unicodeLen=MultiByteToWideChar(sourceCodepage,0,str,-1,NULL,0);
wchar_t * pUnicode; pUnicode=new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
MultiByteToWideChar(sourceCodepage,0,str,-1,(LPWSTR)pUnicode,unicodeLen);
BYTE * pTargetData = 0; int targetLen=WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,0,NULL,NULL);
pTargetData=new BYTE[targetLen+1]; memset(pTargetData,0,targetLen+1);
WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,targetLen,NULL,NULL);
CString rt; rt.Format("%s",pTargetData);
delete pUnicode; delete pTargetData; return rt; }
CString ConvertString( const CString _strVal, const CHAR_MAP _mapNotNormalChar, const WORD_MAP _mapNotNormalWord ) { if ( _strVal.IsEmpty() ) { return _strVal; }
CString strResult = "";
CHAR_MAP NotNormalCharMap = _mapNotNormalChar; WORD_MAP NotNormalWordMap = _mapNotNormalWord;
int iSourceCodePage = CP_UTF8; int iTargetCodePage = 936;
// UTF8 --> ANSI(GBK) CString strAnsi = CharCodeConvert( _strVal, iSourceCodePage, iTargetCodePage ); strAnsi.TrimLeft(); strAnsi.TrimRight();
// 简体 --> 繁体 string strName = strAnsi; int nLen = strName.size(); for ( int nIndex = 0; nIndex < nLen; nIndex ++ ) { WORD wChar = (BYTE)strName[nIndex];
if ( ::IsDBCSLeadByteEx( iTargetCodePage, (BYTE)wChar ) ) { nIndex ++;
WORD wHighByte = wChar; WORD wLowByte = (BYTE)strName[nIndex]; WORD wCharByte = (wHighByte << 8) | wLowByte;
// 简体字 (GB2312汉字编码范围内) if ( (wHighByte >= 0xB0 && wHighByte <= 0xF7) && (wLowByte >= 0xA1 && wLowByte <= 0xFE) ) { char *cpCharTemp = new char[ 2+1 ]; memset( cpCharTemp, 0, 2+1 ); cpCharTemp[0] = strName[nIndex-1]; cpCharTemp[1] = strName[nIndex];
// 非对称简繁体字 if ( ( NotNormalCharMap[ cpCharTemp ] <= 0 ) || ( NotNormalCharMap[ cpCharTemp ] > NotNormalCharMap.size() ) ) { GB2GBK( cpCharTemp ); } else { if ( NotNormalWordMap[ cpCharTemp ].size() > 0 ) { string strSourceChar = cpCharTemp;
vector< WORD_CHAR >::iterator itWord_Char; for ( itWord_Char = (NotNormalWordMap[ cpCharTemp ]).begin(); itWord_Char != (NotNormalWordMap[ cpCharTemp ]).end(); itWord_Char++ ) { WORD_CHAR *word_char = itWord_Char; string strTargetWord = word_char->strWord; string strTargetChar = word_char->strChar;
int iTargetCharIndex = strTargetWord.find( strSourceChar ); int iTargetWordLen = strTargetWord.size(); int iSourceCharIndex = strName.find( strSourceChar );
string strSourceWord = strName.substr( iSourceCharIndex - iTargetCharIndex, iTargetWordLen );
int iCompareResult = strSourceWord.compare( strTargetWord ); if ( !iCompareResult ) { char cpTempChar[2] = {0}; strcpy( cpTempChar, strTargetChar.c_str() ); } } } TRACE( "%s,%s/n", strName, cpCharTemp );
delete[] cpCharTemp; } } } }
return strResult; } |