📄 cjkctype.cpp
字号:
////////////////////////////////////////////
// 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 + -