📄 hcodecnvt.c
字号:
//************************************************************************
//
// * File Name: HCodeCnvt.cpp
//
// Hangul Code Conversion: Another Solution
//
// Date. 199. 7. 12.
// Contact Info.
// Choi, Woonho. at Parole Science, Inc.
// e-mail: whchoi@clepsi.co.kr
// http://www.clepsi.co.kr
// TEL : +82-2-887-8064
// FAX : +82-2-888-6954
//
//
#include "HCodeCnvt.h"
#include "HCodeTable.h"
#include "HCodeDef.h"
#define KSC2UNI_DEFAULT_CHAR (0x0020)
//------------------------------------------------
//
// Hangul Union Structure for KSSM CHO-JUNG-JONG
//
// * Hangul CHO-JUNG-JONG Bitfield Structure
//------------------------------------------------
typedef union _hSyl_
{
unsigned short hCode;
struct
{
unsigned int hJong: 5;
unsigned int hJung: 5;
unsigned int hCho : 5;
unsigned int hFlag: 1;
} hPhoneme;
} structHSyl;
/////////////////////////////////////////////////
// Hangul Combination Macro using Bit-Field
/////////////////////////////////////////////////
#define HAN_COMBI(hStruct, i, m, f) ( (hStruct).hPhoneme.hFlag = 1, (hStruct).hPhoneme.hCho = (i), (hStruct).hPhoneme.hJung = (m), (hStruct).hPhoneme.hJong = (f), (hStruct).hCode)
/////////////////////////////////////////////////
unsigned short
searchKSTable(unsigned short uiTGCode)
{
unsigned short iStart = 0;
unsigned short iEnd = NUMOF_KSCODE_HANGUL;
unsigned short iMid;
while (1)
{
iMid = ((iEnd - iStart) >> 1) + iStart;
if (hctbl_KSCode[iMid] == uiTGCode)
return iMid;
if (iEnd <= iStart) // Hangul Syllable not found in 'hctbl_KSCode' Table
return HCTBL_NOT_FOUND;
else if (hctbl_KSCode[iMid] > uiTGCode)
iEnd = iMid - 1;
else
iStart = iMid + 1;
}
return HCTBL_NOT_FOUND;
}
//===========================================================
// Combination Code to KS C-5601 1987
//
// Return Value
// - KS C-5601 Code Value (if found in table)
// - HCTBL_NOT_FOUND (if not in KS C-5601 1987, 2350 Chars)
//==========================================================
unsigned short
ConvertTG2KSSyl(unsigned short uiTG)
{
unsigned short uiIdx;
uiIdx = searchKSTable(uiTG);
if (uiIdx != HCTBL_NOT_FOUND)
{
return ( (((uiIdx/94) + 0xB0) << 8) + (uiIdx % 94) + 0xA1);
}
// Syllable not found in the range of 2,350 Char(s). KS C-5601 1987
return HCTBL_NOT_FOUND;
}
unsigned short
ConvertKS2TGSyl(unsigned short uiKS)
{
short c1;
short c2;
short idx;
c1 = uiKS >> 8;
c2 = uiKS & 0x00ff;
// Get Array Index from Table ROW-COLUMN Index
idx = (c1 - 0x00B0) * 94 + (c2 - 0x00A1);
if (idx < 0 || idx > NUMOF_KSCODE_HANGUL)
return HCTBL_NOT_FOUND;
return (hctbl_KSCode[idx]);
}
//
// CJK Compatible - Converting
bool
hccUni2KSC_CJKCompatible(wchar_t uniSyl, unsigned char *kscSyl)
{
unsigned short uiSyl;
if (uniSyl >= 0x3380 && uniSyl <= 0x3384)
uiSyl = uniSyl - 0x3380 + 0xA7C9;
else if (uniSyl == 0x3388 || uniSyl == 0x3389)
uiSyl = uniSyl - 0x3388 + 0xA7BA;
else if (uniSyl >= 0x338A && uniSyl <= 0x338C)
uiSyl = uniSyl - 0x338A + 0xA7DC;
else if (uniSyl >= 0x338D && uniSyl <= 0x338F)
uiSyl = uniSyl - 0x338D + 0xA7B6;
else if (uniSyl >= 0x3390 && uniSyl <= 0x3394)
uiSyl = uniSyl - 0x3390 + 0xA7D4;
else if (uniSyl >= 0x3395 && uniSyl <= 0x3398)
{
uiSyl = uniSyl - 0x3395;
switch (uniSyl)
{
case 0x3395:
case 0x3396:
case 0x3397:
uiSyl += 0xA7A1; break;
case 0x3398:
uiSyl = 0xA7A5; break;
}
}
else if (uniSyl >= 0x3399 && uniSyl <= 0x33A2)
uiSyl = uniSyl - 0x3399 + 0xA7AB;
else if (uniSyl >= 0x33A3 && uniSyl <= 0x33A6)
uiSyl = uniSyl - 0x33A3 + 0xA7A7;
else if (uniSyl == 0x33A7 || uniSyl == 0x33A8)
uiSyl = uniSyl - 0x33A7 + 0xA7BD;
else if (uniSyl >= 0x33A9 && uniSyl <= 0x33AC)
uiSyl = uniSyl - 0x33A9 + 0xA7E5;
else if (uniSyl >= 0x33AD && uniSyl <= 0x33AF)
uiSyl = uniSyl - 0x33AD + 0xA7E1;
else if (uniSyl >= 0x33B0 && uniSyl <= 0x33B9)
uiSyl = uniSyl - 0x33B0 + 0xA7BF;
else if (uniSyl >= 0x33BA && uniSyl <= 0x33BF)
uiSyl = uniSyl - 0x33BA + 0xA7CE;
else if (uniSyl == 0x33C0 || uniSyl == 0x33C1)
uiSyl = uniSyl - 0x33C0 + 0xA7DA;
else if (uniSyl >= 0x33C2 && uniSyl <= 0x33FF)
{
switch (uniSyl)
{
case 0x33C2: uiSyl = 0xA2E3; break;
case 0x33C3: uiSyl = 0xA7EC; break;
case 0x33C4: uiSyl = 0xA7A6; break;
case 0x33C5: uiSyl = 0xA7E0; break;
case 0x33C6: uiSyl = 0xA7EF; break;
case 0x33C7: uiSyl = 0xA2E1; break;
case 0x33C8: uiSyl = 0xA7BC; break;
case 0x33C9: uiSyl = 0xA7ED; break;
case 0x33CA: uiSyl = 0xA7B5; break;
case 0x33CF: uiSyl = 0xA7B9; break;
case 0x33D0: uiSyl = 0xA7EA; break;
case 0x33D3: uiSyl = 0xA7EB; break;
case 0x33D6: uiSyl = 0xA7DF; break;
case 0x33D8: uiSyl = 0xA2E4; break;
case 0x33DB: uiSyl = 0xA7E4; break;
case 0x33DC: uiSyl = 0xA7EE; break;
case 0x33DD: uiSyl = 0xA7E9; break;
default: return false;
}
}
*kscSyl = uiSyl >> 8;
*(kscSyl+1) = uiSyl & 0x00ff;
*(kscSyl+2) = '\0';
return true;
}
bool
hccUni2KSCJapanese(wchar_t uniSyl, unsigned char *kscSyl)
{
unsigned short uiSyl;
// Hiragana
if (uniSyl >= 0x3041 && uniSyl <= 0x3093)
{
uiSyl = (uniSyl - 0x3041) + 0xAAA1;
*kscSyl = uiSyl >> 8;
*(kscSyl+1) = uiSyl & 0x00ff;
*(kscSyl+2) = '\0';
return true;
}
// Katakana
if (uniSyl >= 0x30A1 && uniSyl <= 0x30F6)
{
uiSyl = (uniSyl - 0x30A1) + 0xABA1;
*kscSyl = uiSyl >> 8;
*(kscSyl+1) = uiSyl & 0x00ff;
*(kscSyl+2) = '\0';
return true;
}
return false;
}
bool
hccUni2KSC_BoxDrawing(wchar_t uniSyl, unsigned char *kscSyl)
{
unsigned short uiSyl;
short uiIdx;
uiIdx = uniSyl - 0x2500;
if (uiIdx < 0 || uiIdx > NUMOF_BOXDRAW - 1)
return false;
uiSyl = hctbl_UNI2KSC_BOXDRAW[uiIdx];
if (uiSyl == 0xffff)
return false;
*kscSyl = uiSyl >> 8;
*(kscSyl+1) = uiSyl & 0x00ff;
*(kscSyl+2) = '\0';
return true;
}
bool
hccUni2KSC_MathOperator(wchar_t uniSyl, unsigned char *kscSyl)
{
unsigned short uiSyl;
bool bTranslated = false;
if (uniSyl < 0x2200 || uniSyl > 0x22FF)
return false;
switch (uniSyl)
{
// Unicode [Mathematical Operators]
case 0x2200: // Quantifier All
uiSyl = 0xA2A3; bTranslated = true; break;
case 0x2202:
uiSyl = 0xA1D3; bTranslated = true; break;
case 0x2203:
uiSyl = 0xA2A4; bTranslated = true; break;
case 0x2207:
uiSyl = 0xA1D4; bTranslated = true; break;
case 0x2208:
uiSyl = 0xA1F4; bTranslated = true; break;
case 0x220B:
uiSyl = 0xA1F5; bTranslated = true; break;
case 0x220F:
uiSyl = 0xA2B3; bTranslated = true; break;
case 0x2211:
uiSyl = 0xA2B2; bTranslated = true; break;
case 0x221A:
uiSyl = 0xA1EE; bTranslated = true; break;
case 0x221D:
uiSyl = 0xA1F0; bTranslated = true; break;
case 0x221E:
uiSyl = 0xA1C4; bTranslated = true; break;
case 0x2220:
uiSyl = 0xA1D0; bTranslated = true; break;
case 0x2225:
uiSyl = 0xA1AB; bTranslated = true; break;
case 0x2227:
uiSyl = 0xA1FC; bTranslated = true; break;
case 0x2228:
uiSyl = 0xA1FD; bTranslated = true; break;
case 0x2229:
uiSyl = 0xA1FB; bTranslated = true; break;
case 0x222A:
uiSyl = 0xA1FA; bTranslated = true; break;
case 0x222B:
uiSyl = 0xA1F2; bTranslated = true; break;
case 0x222C:
uiSyl = 0xA1F3; bTranslated = true; break;
case 0x222E:
uiSyl = 0xA2B1; bTranslated = true; break;
case 0x2234:
uiSyl = 0xA1C5; bTranslated = true; break;
case 0x2235:
uiSyl = 0xA1F1; bTranslated = true; break;
case 0x223C:
uiSyl = 0xA1AD; bTranslated = true; break;
case 0x223D:
uiSyl = 0xA1EF; bTranslated = true; break;
case 0x2252:
uiSyl = 0xA1D6; bTranslated = true; break;
case 0x2260:
uiSyl = 0xA1C1; bTranslated = true; break;
case 0x2261:
uiSyl = 0xA1D5; bTranslated = true; break;
case 0x2264:
uiSyl = 0xA1C2; bTranslated = true; break;
case 0x2265:
uiSyl = 0xA1C3; bTranslated = true; break;
case 0x226A:
uiSyl = 0xA1EC; bTranslated = true; break;
case 0x226B:
uiSyl = 0xA1ED; bTranslated = true; break;
case 0x2282:
uiSyl = 0xA1F8; bTranslated = true; break;
case 0x2283:
uiSyl = 0xA1F9; bTranslated = true; break;
case 0x2286:
uiSyl = 0xA1F6; bTranslated = true; break;
case 0x2287:
uiSyl = 0xA1F7; bTranslated = true; break;
case 0x2299:
uiSyl = 0xA2C1; bTranslated = true; break;
case 0x22A5:
uiSyl = 0xA1D1; bTranslated = true; break;
default:
bTranslated = false; break;
}
if (bTranslated == true)
{
*kscSyl = uiSyl >> 8;
*(kscSyl+1) = uiSyl & 0x00ff;
*(kscSyl+2) = '\0';
return true;
}
return false;
}
bool
hccUni2KSC_EnclosedAlphaNumerics(wchar_t uniSyl, unsigned char *kscSyl)
{
unsigned short uiSyl;
bool bTranslated= false;
//Range 0x2460 - 0x24ff
if (uniSyl < 0x2460 || uniSyl > 0x24ff)
return false;
if (uniSyl >= 0x2460 && uniSyl <= 0x246E)
{
uiSyl = uniSyl - 0x2460 + 0xA8E7;
bTranslated = true;
}
else if (uniSyl >= 0x2474 && uniSyl <= 0x2482)
{
uiSyl = uniSyl - 0x2474 + 0xA9E7;
bTranslated = true;
}
else if (uniSyl >= 0x249C && uniSyl <= 0x24B5)
{
uiSyl = uniSyl - 0x249C + 0xA9CD;
bTranslated = true;
}
else if (uniSyl >= 0x24D0 && uniSyl <= 0x24E9)
{
uiSyl = uniSyl - 0x24D0 + 0xA8CD;
bTranslated = true;
}
if (bTranslated == true)
{
*kscSyl = uiSyl >> 8;
*(kscSyl+1) = uiSyl & 0x00ff;
*(kscSyl+2) = '\0';
return true;
}
return false;
}
bool
hccUni2KSC_GeometricShapes(wchar_t uniSyl, unsigned char *kscSyl)
{
unsigned short uiSyl;
bool bTranslated = false;
if (uniSyl < 0x25a0 || uniSyl > 0x25ff)
return false;
switch (uniSyl)
{
case 0x25A0:
uiSyl = 0xA1E1; bTranslated = true; break;
case 0x25A1:
uiSyl = 0xA1E0; bTranslated = true; break;
case 0x25A3:
uiSyl = 0xA2C3; bTranslated = true; break;
case 0x25A4:
uiSyl = 0xA2C7; bTranslated = true; break;
case 0x25A5:
uiSyl = 0xA2C8; bTranslated = true; break;
case 0x25A6:
uiSyl = 0xA2CB; bTranslated = true; break;
case 0x25A7:
uiSyl = 0xA2CA; bTranslated = true; break;
case 0x25A8:
uiSyl = 0xA2C9; bTranslated = true; break;
case 0x25A9:
uiSyl = 0xA2CC; bTranslated = true; break;
case 0x25B2:
uiSyl = 0xA1E3; bTranslated = true; break;
case 0x25B3:
uiSyl = 0xA1E2; bTranslated = true; break;
case 0x25B6:
uiSyl = 0xA2BA; bTranslated = true; break;
case 0x25B7:
uiSyl = 0xA2B9; bTranslated = true; break;
case 0x25BC:
uiSyl = 0xA1E5; bTranslated = true; break;
case 0x25BD:
uiSyl = 0xA1E4; bTranslated = true; break;
case 0x25C0:
uiSyl = 0xA2B8; bTranslated = true; break;
case 0x25C1:
uiSyl = 0xA2B7; bTranslated = true; break;
case 0x25C6:
uiSyl = 0xA1DF; bTranslated = true; break;
case 0x25C7:
uiSyl = 0xA1DE; bTranslated = true; break;
case 0x25C8:
uiSyl = 0xA2C2; bTranslated = true; break;
case 0x25CB:
uiSyl = 0xA1DB; bTranslated = true; break;
case 0x25CE:
uiSyl = 0xA1DD; bTranslated = true; break;
case 0x25CF:
uiSyl = 0xA1DC; bTranslated = true; break;
case 0x25D0:
uiSyl = 0xA2C4; bTranslated = true; break;
case 0x25D1:
uiSyl = 0xA2C5; bTranslated = true; break;
default: break;
}
if (bTranslated == true)
{
*kscSyl = uiSyl >> 8;
*(kscSyl+1) = uiSyl & 0x00ff;
*(kscSyl+2) = '\0';
return true;
}
return false;
}
bool
hccUni2KSC_MiscDingbats(wchar_t uniSyl, unsigned char *kscSyl)
{
unsigned short uiSyl;
bool bTranslated = false;
if (uniSyl < 0x2600 || uniSyl > 0x26ff)
return false;
switch (uniSyl)
{
case 0x2605:
uiSyl = 0xA1DA; bTranslated = true; break;
case 0x2606:
uiSyl = 0xA1D9; bTranslated = true; break;
case 0x260E:
uiSyl = 0xA2CF; bTranslated = true; break;
case 0x260F:
uiSyl = 0xA2CE; bTranslated = true; break;
case 0x261C:
uiSyl = 0xA2D0; bTranslated = true; break;
case 0x261E:
uiSyl = 0xA2D1; bTranslated = true; break;
case 0x2640:
uiSyl = 0xA1CF; bTranslated = true; break;
case 0x2642:
uiSyl = 0xA1CE; bTranslated = true; break;
case 0x2660:
uiSyl = 0xA2BC; bTranslated = true; break;
case 0x2661:
uiSyl = 0xA2BD; bTranslated = true; break;
case 0x2663:
uiSyl = 0xA2C0; bTranslated = true; break;
case 0x2664:
uiSyl = 0xA2BB; bTranslated = true; break;
case 0x2665:
uiSyl = 0xA2BE; bTranslated = true; break;
case 0x2667:
uiSyl = 0xA2BF; bTranslated = true; break;
case 0x2668:
uiSyl = 0xA2CD; bTranslated = true; break;
case 0x2669:
uiSyl = 0xA2DB; bTranslated = true; break;
case 0x266A:
uiSyl = 0xA2DC; bTranslated = true; break;
case 0x266C:
uiSyl = 0xA2DD; bTranslated = true; break;
case 0x266D:
uiSyl = 0xA2DA; bTranslated = true; break;
default: break;
}
if (bTranslated == true)
{
*kscSyl = uiSyl >> 8;
*(kscSyl+1) = uiSyl & 0x00ff;
*(kscSyl+2) = '\0';
return true;
}
return false;
}
bool
hccUni2KSC_CJKSymPunc(wchar_t uniSyl, unsigned char *kscSyl)
{
unsigned short uiSyl;
bool bTranslated = false;
if (uniSyl < 0x3000 || uniSyl > 0x303F)
return false;
switch (uniSyl)
{
case 0x3001:
uiSyl = 0xA1A2; bTranslated = true; break;
case 0x3002:
uiSyl = 0xA1C6; bTranslated = true; break;
case 0x3003:
uiSyl = 0xA1C8; bTranslated = true; break;
case 0x3008:
uiSyl = 0xA1B4; bTranslated = true; break;
case 0x3009:
uiSyl = 0xA1B5; bTranslated = true; break;
case 0x300A:
uiSyl = 0xA1B6; bTranslated = true; break;
case 0x300B:
uiSyl = 0xA1B7; bTranslated = true; break;
case 0x300C:
uiSyl = 0xA1B8; bTranslated = true; break;
case 0x300D:
uiSyl = 0xA1B9; bTranslated = true; break;
case 0x300E:
uiSyl = 0xA1BA; bTranslated = true; break;
case 0x300F:
uiSyl = 0xA1BB; bTranslated = true; break;
case 0x3010:
uiSyl = 0xA1BC; bTranslated = true; break;
case 0x3011:
uiSyl = 0xA1BD; bTranslated = true; break;
case 0x3013:
uiSyl = 0xA1EB; bTranslated = true; break;
case 0x3014:
uiSyl = 0xA1B2; bTranslated = true; break;
case 0x3015:
uiSyl = 0xA1B3; bTranslated = true; break;
default: break;
}
if (bTranslated == true)
{
*kscSyl = uiSyl >> 8;
*(kscSyl+1) = uiSyl & 0x00ff;
*(kscSyl+2) = '\0';
return true;
}
return false;
}
bool
hccUni2KSC_EnclosedCJKLetters(wchar_t uniSyl, unsigned char *kscSyl)
{
unsigned short uiSyl;
bool bTranslated = false;
// 0x3200 - 0x32ff
if (uniSyl < 0x3200 || uniSyl > 0x32FF)
return false;
if (uniSyl >= 0x3200 && uniSyl <= 0x321B)
{
uiSyl = uniSyl - 0x3200 + 0xA9B1;
bTranslated = true;
}
else if (uniSyl >= 0x3260 && uniSyl <= 0x327B)
{
uiSyl = uniSyl - 0x3260 + 0xA8B1;
bTranslated = true;
}
else if (uniSyl == 0x321C)
{
uiSyl = 0xA2DF;
bTranslated = true;
}
else if (uniSyl == 0x327F)
{
uiSyl = 0xA2DE;
bTranslated = true;
}
if (bTranslated == true)
{
*kscSyl = uiSyl >> 8;
*(kscSyl+1) = uiSyl & 0x00ff;
*(kscSyl+2) = '\0';
return true;
}
return false;
}
bool
hccUni2KSC_HalfFullForms(wchar_t uniSyl, unsigned char *kscSyl)
{
unsigned short uiSyl;
bool bTranslated = true;
if (uniSyl < 0xff00 || uniSyl > 0x00ef)
return false;
if (uniSyl >= 0xFF00 && uniSyl <= 0xFF5D)
{
uiSyl = uniSyl - 0xFF00 + 0xA3A0;
bTranslated = true;
}
else
{
switch (uniSyl)
{
case 0xFF5E:
uiSyl = 0xA1AD; bTranslated = true; break;
case 0xFFE0:
uiSyl = 0xA1CB; bTranslated = true; break;
case 0xFFE1:
uiSyl = 0xA1CC; bTranslated = true; break;
case 0xFFE2:
uiSyl = 0xA1FE; bTranslated = true; break;
case 0xFFE3:
uiSyl = 0xA3FE; bTranslated = true; break;
case 0xFFE5:
uiSyl = 0xA1CD; bTranslated = true; break;
case 0xFFE6:
uiSyl = 0xA1DC; bTranslated = true; break;
default: break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -