#include "stdafx.h" void gb_2_big (unsigned char *in_str, unsigned chg_length, unsigned char *out_str ,unsigned *outstr_size,unsigned char *big_str) { unsigned chg_start; unsigned pos_of_big; unsigned char rh1, rh2; chg_start = 0; out_str[0] = '\0'; *outstr_size = 0; while ( chg_start < chg_length ){ rh1 = in_str[chg_start]; chg_start = chg_start + 1; if ( rh1 >= 161 && rh1 < 251 && chg_start < chg_length ) { rh2 = in_str[chg_start]; chg_start = chg_start + 1; if ( rh2 >= 160 && chg_start <= chg_length ) { pos_of_big = (rh1 - 161) * 96 * 2 + (rh2 - 160) * 2; out_str[(*outstr_size)++] = big_str[pos_of_big]; out_str[(*outstr_size)++] = big_str[pos_of_big+1]; } else { if (chg_start <= chg_length){ out_str[(*outstr_size)++] = rh1; chg_start = chg_start - 1; } } } else if ( rh1 < 161 || rh1 >= 251 ) out_str[(*outstr_size)++] = rh1; } } void big_2_gb (unsigned char *in_str, unsigned chg_length, unsigned char *out_str, unsigned *outstr_size, unsigned char *gb_str){ unsigned chg_start; unsigned pos_of_gb; unsigned char rh1,rh2; chg_start = 0; out_str[0] = '\0'; (*outstr_size) = 0; while (chg_start < chg_length){ rh1 = in_str[chg_start]; chg_start = chg_start + 1; if (rh1 >= 161 && rh1 <= 251 && chg_start < chg_length) { rh2 = in_str[chg_start]; chg_start = chg_start + 1; if (rh2 >= 64 && rh2 < 128 && chg_start <= chg_length ) { pos_of_gb = (rh1 - 161) * 160 * 2 + (rh2 - 64) * 2; out_str[(*outstr_size)++] = gb_str[pos_of_gb]; out_str[(*outstr_size)++] = gb_str[pos_of_gb+1]; } else { if ( chg_start <= chg_length ) { if ( rh2 >= 160 ) { pos_of_gb = (rh1 - 161) * 160 * 2 + (rh2 - 160) * 2 + 64 * 2; out_str[(*outstr_size)++] = gb_str[pos_of_gb]; out_str[(*outstr_size)++] = gb_str[pos_of_gb+1]; } else { out_str[(*outstr_size)++] = rh1; chg_start = chg_start - 1; } } } } else if ( rh1 < 161 || rh1 > 251 ) out_str[(*outstr_size)++] = rh1; } } int GBToBig5(const TCHAR *szSrc0, XString &sDest, void *pCodeTable) { AString szSrc1(szSrc0); const char* szSrc=(const char*)szSrc1; unsigned nLen=(unsigned)strlen(szSrc); unsigned nOut=0; char *szDest=strnew(szSrc); gb_2_big((unsigned char *)szSrc, nLen, (unsigned char *)szDest, &nOut, (unsigned char *)pCodeTable); ASSERT(nOut==nLen); sDest=(LPCTSTR)TString(szDest); delete[] szDest; return RTNORM; } int Big5ToGB(const TCHAR *szSrc0, XString &sDest, void *pCodeTable) { AString szSrc1(szSrc0); const char* szSrc=(const char*)szSrc1; unsigned nLen=(unsigned)strlen(szSrc); unsigned nOut=0; char *szDest=strnew(szSrc); big_2_gb((unsigned char *)szSrc, nLen, (unsigned char *)szDest, &nOut, (unsigned char *)pCodeTable); ASSERT(nOut==nLen); sDest=(LPCTSTR)TString(szDest); delete[] szDest; return RTNORM; }