⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gaiji.cpp

📁 This software performs code conversion of Chinese characters, including GB2312/GBK and BIG5. It a
💻 CPP
字号:
// gaiji.cpp

#include "msc.h"
#include "gaiji.h"
#include "codepage.h"
#include "unicode.h"



static const unsigned short Uni2gbTable_E760_E80F [] = {
      0xA79B,  0xA79C,  0xA79D,  0xA79E,  0xA79F,  0xA7A0,  0xA2AB,  0xA2AC,  // 0xE76x
      0xA2AD,  0xA2AE,  0xA2AF,  0xA2B0,  0xA2E3,  0xA2E4,  0xA2EF,  0xA2F0,
      0xA2FD,  0xA2FE,  0xA4F4,  0xA4F5,  0xA4F6,  0xA4F7,  0xA4F8,  0xA4F9,  // 0xE77x
      0xA4FA,  0xA4FB,  0xA4FC,  0xA4FD,  0xA4FE,  0xA5F7,  0xA5F8,  0xA5F9,
      0xA5FA,  0xA5FB,  0xA5FC,  0xA5FD,  0xA5FE,  0xA6B9,  0xA6BA,  0xA6BB,  // 0xE78x
      0xA6BC,  0xA6BD,  0xA6BE,  0xA6BF,  0xA6C0,  0xA6D9,  0xA6DA,  0xA6DB,
      0xA6DC,  0xA6DD,  0xA6DE,  0xA6DF,  0xA6EC,  0xA6ED,  0xA6F3,  0xA6F6,  // 0xE79x
      0xA6F7,  0xA6F8,  0xA6F9,  0xA6FA,  0xA6FB,  0xA6FC,  0xA6FD,  0xA6FE,
      0xA7C2,  0xA7C3,  0xA7C4,  0xA7C5,  0xA7C6,  0xA7C7,  0xA7C8,  0xA7C9,  // 0xE7Ax
      0xA7CA,  0xA7CB,  0xA7CC,  0xA7CD,  0xA7CE,  0xA7CF,  0xA7D0,  0xA7F2,
      0xA7F3,  0xA7F4,  0xA7F5,  0xA7F6,  0xA7F7,  0xA7F8,  0xA7F9,  0xA7FA,  // 0xE7Bx
      0xA7FB,  0xA7FC,  0xA7FD,  0xA7FE,  0xA896,  0xA897,  0xA898,  0xA899,
      0xA89A,  0xA89B,  0xA89C,  0xA89D,  0xA89E,  0xA89F,  0xA8A0,  0xA8BC,  // 0xE7Cx
      0xA8BF,  0xA8C1,  0xA8C2,  0xA8C3,  0xA8C4,  0xA8EA,  0xA8EB,  0xA8EC,
      0xA8ED,  0xA8EE,  0xA8EF,  0xA8F0,  0xA8F1,  0xA8F2,  0xA8F3,  0xA8F4,  // 0xE7Dx
      0xA8F5,  0xA8F6,  0xA8F7,  0xA8F8,  0xA8F9,  0xA8FA,  0xA8FB,  0xA8FC,
      0xA8FD,  0xA8FE,  0xA958,  0xA95B,  0xA95D,  0xA95E,  0xA95F,  0xA989,  // 0xE7Ex
      0xA98A,  0xA98B,  0xA98C,  0xA98D,  0xA98E,  0xA98F,  0xA990,  0xA991,
      0xA992,  0xA993,  0xA994,  0xA995,  0xA997,  0xA998,  0xA999,  0xA99A,  // 0xE7Fx
      0xA99B,  0xA99C,  0xA99D,  0xA99E,  0xA99F,  0xA9A0,  0xA9A1,  0xA9A2,
      0xA9A3,  0xA9F0,  0xA9F1,  0xA9F2,  0xA9F3,  0xA9F4,  0xA9F5,  0xA9F6,  // 0xE80x
      0xA9F7,  0xA9F8,  0xA9F9,  0xA9FA,  0xA9FB,  0xA9FC,  0xA9FD,  0xA9FE,
      0, // dummy
} ;



// 儅儖僠僶僀僩僐乕僪偺奜帤傪 Unicode 偵曄姺偡傞
int GaijiToUnicode ( int C, int nCodePage ) {

   if ( nCodePage == CP_JAPANESE ) {
      if ( C >= 0xF040 && C <= 0xF9FC ) {
         if ( ( C & 0xFF ) >= 0x40 && ( C & 0xFF ) <= 0x7E )
            return ( ( ( C >> 8 ) - 0xF0 ) * 0xBC ) + ( ( C & 0xFF ) - 0x40 ) + 0xE000 ;
         if ( ( C & 0xFF ) >= 0x80 && ( C & 0xFF ) <= 0xFC )
            return ( ( ( C >> 8 ) - 0xF0 ) * 0xBC ) + ( ( C & 0xFF ) - 0x40 - 1 ) + 0xE000 ;
      }
      return 0 ;
   }

   if ( nCodePage == CP_KOREAN ) {
      if ( C >= 0xC9A1 && C <= 0xC9FE ) return C - 0xC9A1 + 0xE000 ;
      if ( C >= 0xFEA1 && C <= 0xFEFE ) return C - 0xFEA1 + 0xE05E ;
      return 0 ;
   }

   if ( nCodePage == CP_KOREAN_JOHAB ) {
      if ( C >= 0xD831 && C <= 0xD87E ) return C - 0xD831 + 0xE000 ;
      if ( C >= 0xD891 && C <= 0xD8FE ) return C - 0xD891 + 0xE04E ;
      return 0 ;
   }

   if ( nCodePage == CP_CHINESE_SIMPLIFIED ) {
      if ( C <= 0xAFFE && C >= 0xAAA1 && ( C & 0xFF ) >= 0xA1 && ( C & 0xFF ) <= 0xFE )
         return ( ( ( C >> 8 ) - 0xAA ) * 0x5E ) + ( ( C & 0xFF ) - 0xA1 ) + 0xE000 ;
      if ( C >= 0xF8A1 && C <= 0xFEFE && ( C & 0xFF ) >= 0xA1 && ( C & 0xFF ) <= 0xFE )
         return ( ( ( C >> 8 ) - 0xF8 ) * 0x5E ) + ( ( C & 0xFF ) - 0xA1 ) + 0xE234 ;
      if ( C <= 0xA7A0 && C >= 0xA140 ) {
         if ( ( C & 0xFF ) >= 0x40 && ( C & 0xFF ) <= 0x7E )
            return ( ( ( C >> 8 ) - 0xA1 ) * 0x60 ) + ( ( C & 0xFF ) - 0x40 ) + 0xE4C6 ;
         if ( ( C & 0xFF ) >= 0x80 && ( C & 0xFF ) <= 0xA0 )
            return ( ( ( C >> 8 ) - 0xA1 ) * 0x60 ) + ( ( C & 0xFF ) - 0x40 ) + 0xE4C6 - 1 ;
      }
      if ( C <= 0xA9FE && C >= 0xA2AB ) {
         for ( const unsigned short *p = Uni2gbTable_E760_E80F ; *p ; p ++ ) {
            if ( *p == C ) return (int) ( p - Uni2gbTable_E760_E80F ) + 0xE760 ;
         }
      }
      if ( C >= 0xD7FA && C <= 0xD7FE ) return C - 0xD7FA + 0xE810 ;
      if ( C >= 0xFE50 && C <= 0xFE7E ) return C - 0xFE50 + 0xE815 ;
      if ( C >= 0xFE80 && C <= 0xFEA0 ) return C - 0xFE80 + 0xE844 ;
      return 0 ;
   }

   if ( nCodePage == CP_CHINESE_TRADITIONAL ) {
      int nTemp = 0 ;
      if ( C >= 0xFA40 && C <= 0xFEFE ) nTemp = 0xE000 - ( 0xFA * 0x9D ) ;
      if ( C <= 0xA0FE && C >= 0x8E40 ) nTemp = 0xE311 - ( 0x8E * 0x9D ) ;
      if ( C <= 0x8DFE && C >= 0x8140 ) nTemp = 0xEEB8 - ( 0x81 * 0x9D ) ;
      if ( C >= 0xC6A1 && C <= 0xC8FE ) nTemp = 0xF672 - ( 0xC6 * 0x9D ) ;
      if ( nTemp == 0 ) return 0 ;
      if ( ( C & 0xFF ) >= 0x40 && ( C & 0xFF ) <= 0x7E )
         return ( ( C >> 8 ) * 0x9D ) + ( ( C & 0xFF ) - 0x40 ) + nTemp ;
      if ( ( C & 0xFF ) >= 0xA1 && ( C & 0xFF ) <= 0xFE )
         return ( ( C >> 8 ) * 0x9D ) + ( ( C & 0xFF ) - 0x40 - 0x22 ) + nTemp ;
      return 0 ;
   }

   return 0 ;
}



// Unicode 偺 PUA 傪 儅儖僠僶僀僩僐乕僪偺奜帤偵曄姺偡傞
int UnicodeToGaiji ( int C, int nCodePage ) {

   if ( ! IsUnicodePua ( C ) ) return 0 ;

   if ( nCodePage == CP_JAPANESE ) {
      if ( C >= 0xE000 && C <= 0xE757 ) {
         int nTemp = (unsigned)( C - 0xE000 ) % 0xBC ;
         if ( nTemp < ( 0x7F - 0x40 ) ) return ( ( (unsigned)( C - 0xE000 ) / 0xBC ) * 0x100 + 0xF000 ) + nTemp + 0x40 ;
         else                           return ( ( (unsigned)( C - 0xE000 ) / 0xBC ) * 0x100 + 0xF000 ) + nTemp + 0x40 + 1 ;
      }
      if ( C == 0xF8F0 ) return 0xA0 ;
      if ( C >= 0xF8F1 && C <= 0xF8F3 ) return C - 0xF8F1 + 0xFD ;
      return 0 ;
   }

   if ( nCodePage == CP_KOREAN ) {
      if ( C >= 0xE000 && C <= 0xE05D ) return C + 0xC9A1 - 0xE000 ;
      if ( C >= 0xE05E && C <= 0xE0BB ) return C + 0xFEA1 - 0xE05E ;
      if ( C == 0xF8F7 ) return 0xFF ;
      return 0 ;
   }

   if ( nCodePage == CP_KOREAN_JOHAB ) {
      if ( C >= 0xE000 && C <= 0xE04D ) return C + 0xD831 - 0xE000 ;
      if ( C >= 0xE04E && C <= 0xE0BB ) return C + 0xD891 - 0xE04E ;
      return 0 ;
   }

   if ( nCodePage == CP_CHINESE_SIMPLIFIED ) {
      if ( C >= 0xE000 && C <= 0xE233 ) return ( ( (unsigned)( C - 0xE000 ) / 0x5E ) + 0xAA ) * 0x100 + (unsigned)( C - 0xE000 ) % 0x5E + 0xA1 ;
      if ( C >= 0xE234 && C <= 0xE4C5 ) return ( ( (unsigned)( C - 0xE234 ) / 0x5E ) + 0xF8 ) * 0x100 + (unsigned)( C - 0xE234 ) % 0x5E + 0xA1 ;
      if ( C >= 0xE4C6 && C <= 0xE75F ) {
         int cHigh = (unsigned)( C - 0xE4C6 ) / ( 0xA0 - 0x40 ) ;
         int cLow = (unsigned)( C - 0xE4C6 ) % ( 0xA0 - 0x40 ) ;
         if ( cLow < 0x3F ) return ( cHigh + 0xA1 ) * 0x100 + cLow + 0x40 ;
         else               return ( cHigh + 0xA1 ) * 0x100 + cLow + 0x40 + 1 ;
      }
      if ( C >= 0xE760 && C <= 0xE80F ) return Uni2gbTable_E760_E80F [ C - 0xE760 ] ;
      if ( C >= 0xE810 && C <= 0xE814 ) return C + 0xD7FA - 0xE810 ;
      if ( C >= 0xE815 && C <= 0xE843 ) return C + 0xFE50 - 0xE815 ;
      if ( C >= 0xE844 && C <= 0xE864 ) return C + 0xFE80 - 0xE844 ;
      if ( C == 0xF8F5 ) return 0xFF ;
      return 0 ;
   }

   if ( nCodePage == CP_CHINESE_TRADITIONAL ) {
      int cHigh = 0 ;
      if ( C >= 0xE000 && C <= 0xE310 ) cHigh = ( (unsigned)( C - 0xE000 ) / 0x9D ) + 0xFA ;
      if ( C >= 0xE311 && C <= 0xEEB7 ) cHigh = ( (unsigned)( C - 0xE311 ) / 0x9D ) + 0x8E ;
      if ( C >= 0xEEB8 && C <= 0xF6B0 ) cHigh = ( (unsigned)( C - 0xEEB8 ) / 0x9D ) + 0x81 ;
      if ( cHigh ) {
         int cLow = (unsigned)( C - 0xE000 ) % 0x9D ;
         if ( cLow <= 0x3E ) return ( cHigh * 0x100 ) + cLow + 0x40 ;
         else                return ( cHigh * 0x100 ) + cLow + 0x40 + 0x22 ;
      }
      if ( C >= 0xF6B1 && C <= 0xF848 ) cHigh = ( (unsigned)( C - 0xF6B1 + 0x3F ) / 0x9D ) + 0xC6 ;
      if ( cHigh ) {
         int cLow = (unsigned)( C - 0xF6B1 + 0x3F ) % 0x9D ;
         if ( cLow <= 0x3E ) return ( cHigh * 0x100 ) + cLow + 0x40 ;
         else                return ( cHigh * 0x100 ) + cLow + 0x40 + 0x22 ;
      }
      if ( C == 0xF8F8 ) return 0xFF ;
      return 0 ;
   }

   return 0 ;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -