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

📄 cjkctype.cpp

📁 This software performs code conversion of Chinese characters, including GB2312/GBK and BIG5. It a
💻 CPP
📖 第 1 页 / 共 5 页
字号:
////////////////////////////////////////////



// ANSI暥帤楍傪儚僀僪暥帤偵曄姺偟偰暋惢偡傞
// free() 傪巊偭偰夝曻偡傞偙偲
// 幐攕偟偨傜 NULL 傪曉偡
wchar_t *a2wdup_cp ( const char *string, int codepage ) {
   return a2wduplen ( string, -1, NULL ) ;
}



// ANSI暥帤楍傪儚僀僪暥帤偵曄姺偟偰暋惢偡傞乮挿偝傪巜掕乯
// 挿偝偑 -1 側傜僰儖廔抂暥帤楍偲尒側偡
// 弌椡偝傟偨挿偝傪 p_dstlen 偵奿擺乮昁梫偱側偗傟偽 NULL 偱傕壜乯
// free() 傪巊偭偰夝曻偡傞偙偲
// 幐攕偟偨傜 NULL 傪曉偡
wchar_t *a2wduplen_cp ( const char *string, int srclen, int *p_dstlen, int codepage ) {

   int length ;
   wchar_t *buffer ;

   if ( ! ( length = MultiByteToWideChar ( codepage, 0, string, srclen, NULL, 0 ) ) ) return NULL ;
   if ( ! ( buffer = (wchar_t*) malloc ( length * sizeof(wchar_t) ) ) ) return NULL ;
   if ( ! ( length = MultiByteToWideChar ( codepage, 0, string, srclen, buffer, length ) ) ) { free ( buffer ) ; return NULL ; }

   if ( p_dstlen ) *p_dstlen = length ;

   return buffer ;
}



// 儚僀僪暥帤楍傪ANSI暥帤楍偵曄姺偟偰暋惢偡傞
// 曄姺偱偒側偄暥帤偑偁傟偽 errno 偵 EILSEQ 傪僙僢僩偡傞
// free() 傪巊偭偰夝曻偡傞偙偲
// 幐攕偟偨傜 NULL 傪曉偡
char *w2adup_cp ( const wchar_t *string, int codepage ) {
   return w2aduplen ( string, -1, NULL ) ;
}



// 儚僀僪暥帤楍傪ANSI暥帤楍偵曄姺偟偰暋惢偡傞乮挿偝傪巜掕乯
// 挿偝偑 -1 側傜僰儖廔抂暥帤楍偲尒側偡
// 弌椡偝傟偨挿偝傪 p_dstlen 偵奿擺乮昁梫偱側偗傟偽 NULL 偱傕壜乯
// 曄姺偱偒側偄暥帤偑偁傟偽 errno 偵 EILSEQ 傪僙僢僩偡傞
// free() 傪巊偭偰夝曻偡傞偙偲
// 幐攕偟偨傜 NULL 傪曉偡
char *w2aduplen_cp ( const wchar_t *string, int srclen, int *p_dstlen, int codepage ) {

   int IsUsedDefaultChar = 0 ;

   int length ;
   char *buffer ;

   if ( ! ( length = WideCharToMultiByte ( codepage, 0, string, srclen, NULL, 0, NULL, NULL ) ) ) return NULL ;
   if ( ! ( buffer = (char*) malloc ( length * sizeof(char) ) ) ) return NULL ;
   if ( ! ( length = WideCharToMultiByte ( codepage, 0, string, srclen, buffer, length, NULL, & IsUsedDefaultChar ) ) ) { free ( buffer ) ; return NULL ; }

   if ( p_dstlen ) *p_dstlen = length ;

   if ( IsUsedDefaultChar ) errno = EILSEQ ;

   return buffer ;
}



////////////////////////////////////////////
//               strldup ()               //
////////////////////////////////////////////



// 巜掕偝傟偨挿偝傑偱暥帤楍傪暋惢偡傞乮MULTIBYTE斉乯
// bufsiz 偼怴偟偄暥帤楍偵廂傔傞偙偲偺偱偒傞嵟戝偺暥帤悢乮廔抂僰儖暥帤傪娷傓乯
char *mbsldup_cp ( const char *string, size_t bufsiz, int codepage ) {

   size_t len = strlen ( string ) ;
   if ( len >= bufsiz ) len = bufsiz - 1 ;

   char *buffer = (char*) malloc ( ( len + 1 ) * sizeof(char) ) ;
   if ( buffer ) {
      memmove ( buffer, string, len * sizeof(char) ) ;
      mbstrunc_cp ( buffer, len, codepage ) ;
   }

   return buffer ;
}



////////////////////////////////////////////
//               mbsbtype ()              //
////////////////////////////////////////////



// 儅儖僠僶僀僩暥帤傪敾掕
int mbsbtype_cp ( const char *string, size_t count, int codepage ) {

   int isprevlead = 0 ;

   for ( const char *current = string ; *current ; current ++ ) {
      if ( size_t ( current - string ) == count ) {
         if ( isprevlead ) {
            if ( ismbbtrail_cp ( (unsigned char) *current, codepage ) ) return _MBC_TRAIL ;
            else                                                        return _MBC_ILLEGAL ;
         }
         else {
            if ( ismbblead_cp ( (unsigned char) *current, codepage ) ) return _MBC_LEAD ;
            else if ( *current )                                       return _MBC_SINGLE ;
            else                                                       return _MBC_ILLEGAL ;
         }
      }
      if ( ! isprevlead && ismbblead_cp ( (unsigned char) *current, codepage ) ) isprevlead = 1 ;
      else                                                                       isprevlead = 0 ;
   }

   return _MBC_ILLEGAL ;
}



// 儅儖僠僶僀僩暥帤傪敾掕
int ismbslead_cp ( const char *string, const char *current, int codepage ) {
   if ( mbsbtype_cp ( string, current - string, codepage ) == _MBC_LEAD ) return -1 ;
   return 0 ;
}



// 儅儖僠僶僀僩暥帤傪敾掕
int ismbstrail_cp ( const char *string, const char *current, int codepage ) {
   if ( mbsbtype_cp ( string, current - string, codepage ) == _MBC_TRAIL ) return -1 ;
   return 0 ;
}



////////////////////////////////////////////
//               jis / sjis               //
////////////////////////////////////////////



// Shift JIS 傪 JIS 偵曄姺偡傞
int jmstojis ( int c ) {

   int high = c >> 8 ;
   int low = c & 0xFF ;

   if ( high & ~ 0xFF || ! ismbblead_sjis ( high ) || ! ismbbtrail_sjis ( low ) ) return 0 ;

   if ( high <= 0x9F ) {
      if ( low < 0x9F ) high = ( high << 1 ) - 0xE1 ;
      else              high = ( high << 1 ) - 0xE0 ;
   }
   else if ( high < 0xF0 ) {
      if ( low < 0x9F ) high = ( high << 1 ) - ( 0x80 + 0xE1 ) ;
      else              high = ( high << 1 ) - ( 0x80 + 0xE0 ) ;
   }
   else return 0 ;

   if ( low < 0x7F )      low -= 0x1F ;
   else if ( low < 0x9F ) low -= 0x20 ;
   else                   low -= 0x7E ;

   return ( high << 8 ) | low ;
}



// JIS 傪 Shift JIS 偵曄姺偡傞
int jistojms ( int c ) {

   int high = c >> 8 ;
   int low = c & 0xFF ;

   if ( high < 0x21 || high > 0x7E || low < 0x21 || low > 0x7E ) return 0 ;

   if ( high & 1 ) {
      if ( low < 0x60 ) low += 0x1F ;
      else              low += 0x20 ;
   }
   else {
      low += 0x7E ;
   }

   if ( high < 0x5F ) high = ( high + 0xE1 ) >> 1 ;
   else               high = ( high + ( 0x80 + 0xE1 ) ) >> 1 ;

   return ( high << 8 ) | low ;
}



////////////////////////////////////////////
//                  ctype                 //
////////////////////////////////////////////



#define JP        0x1
#define GB        0x2
#define B5        0x4
#define KR        0x8
#define JH       0x10
#define CN       0x20
#define TC       0x40
#define ET       0x80
#define IB      0x100
#define TL      0x200
#define WA      0x400
#define MG      0x800
#define MT     0x1000
#define MK     0x2000
#define EJ     0x4000
#define EG     0x8000
#define EK    0x10000
#define T6    0x20000



static unsigned long getbitmask ( int codepage ) {

   unsigned long bitmask ;

   switch ( codepage ) {
      case CP_ACP : codepage = GetACP () ; break ;
      case CP_OEMCP : codepage = GetOEMCP () ; break ;
   }

   switch ( codepage ) {
      case CP_JAPANESE : bitmask = JP ; break ;
      case CP_CHINESE_SIMPLIFIED : bitmask = GB ; break ;
      case CP_CHINESE_SIMPLIFIED_EX : bitmask = GB ; break ;
      case CP_CHINESE_TRADITIONAL : bitmask = B5 ; break ;
      case CP_CHINESE_HKSCS : bitmask = B5 ; break ;
      case CP_KOREAN : bitmask = KR ; break ;
      case CP_KOREAN_JOHAB : bitmask = JH ; break ;
      case CP_CHINESE_TRADITIONAL_CNS : bitmask = CN ; break ;
      case CP_CHINESE_TRADITIONAL_TCA : bitmask = TC ; break ;
      case CP_CHINESE_TRADITIONAL_ETEN : bitmask = ET ; break ;
      case CP_CHINESE_TRADITIONAL_IBM5550 : bitmask = IB ; break ;
      case CP_CHINESE_TRADITIONAL_TELETEXT : bitmask = TL ; break ;
      case CP_CHINESE_TRADITIONAL_WANG : bitmask = WA ; break ;
      case CP_MAC_CHINESE_SIMPLIFIED : bitmask = MG ; break ;
      case CP_MAC_CHINESE_TRADITIONAL : bitmask = MT ; break ;
      case CP_MAC_KOREAN : bitmask = MK ; break ;
      case CP_EUC_JAPANESE_MS : bitmask = EJ ; break ;
      case CP_EUC_CHINESE_SIMPLIFIED : bitmask = EG ; break ;
      case CP_EUC_KOREAN : bitmask = EK ; break ;
      case CP_EUC_KOREAN_2 : bitmask = EK ; break ;
      case CP_T61 : bitmask = T6 ; break ;
      default : bitmask = 0 ; break ;
   }

   return bitmask ;
}



int ismbblead_cp ( int c, int codepage ) {

   static const unsigned long cjkctype_lead [] = {
      /* -1 */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,
      /* 00 */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,
      /* 01 */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,
      /* 02 */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,
      /* 03 */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,
      /* 04 */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,
      /* 05 */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,
      /* 06 */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,
      /* 07 */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,
      /* 08 */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,
      /* 09 */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,
      /* 0A */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,
      /* 0B */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,
      /* 0C */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,
      /* 0D */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,
      /* 0E */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,
      /* 0F */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,
      /* 10 */   0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0,

⌨️ 快捷键说明

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