📄 gaiji.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 + -