📄 hcodecnvt.c
字号:
int
KSC2UniString(unsigned char *kscString, wchar_t *uniString)
{
unsigned char *pStr;
unsigned long i;
int uniLen;
for (pStr = kscString, i = 0, uniLen = 0; *pStr; pStr++, i++, uniLen++)
{
if (KSC2UniSyl(pStr, &uniString[i]) == true)
{
if (uniString[i] == 0x0000)
uniString[i] = KSC2UNI_DEFAULT_CHAR;
}
else
uniString[i] = KSC2UNI_DEFAULT_CHAR;
if (*pStr & 0x80)
pStr++;
}
uniString[i] = 0x0000;
return uniLen;
}
bool
hccKSC2Uni_BlockA8(unsigned short kscSyl, wchar_t *uniSyl)
{
switch (kscSyl)
{
case 0xA8A1:
*uniSyl = 0x00C6; return true;
case 0xA8A2:
*uniSyl = 0x00D0; return true;
case 0xA8A4:
*uniSyl = 0x0126; return true;
case 0xA8A6:
*uniSyl = 0x0132; return true;
case 0xA8A8:
*uniSyl = 0x013F; return true;
case 0xA8A9:
*uniSyl = 0x0141; return true;
case 0xA8AA:
*uniSyl = 0x00D8; return true;
case 0xA8AC:
*uniSyl = 0x00BA; return true;
case 0xA8AD:
*uniSyl = 0x00DE; return true;
case 0xA8AE:
*uniSyl = 0x0166; return true;
case 0xA8AF:
*uniSyl = 0x014A; return true;
case 0xA8F6:
*uniSyl = 0x00BD; return true;
case 0xA8F7:
*uniSyl = 0x2153; return true;
case 0xA8F8:
*uniSyl = 0x2154; return true;
case 0xA8F9:
*uniSyl = 0x00BC; return true;
case 0xA8FA:
*uniSyl = 0x00BE; return true;
}
if (kscSyl >= 0xA8FB && kscSyl <= 0xA8FE)
{
*uniSyl = kscSyl - 0xA8FB + 0x215B;
return true;
}
if (kscSyl >= 0xA8B1 && kscSyl <= 0xA8CC)
{
*uniSyl = kscSyl - 0xA8B1 + 0x3260;
return true;
}
if (kscSyl >= 0xA8CD && kscSyl <= 0xA8E6)
{
*uniSyl = kscSyl - 0xA8CD + 0x24D0;
return true;
}
if (kscSyl >= 0xA8E7 && kscSyl <= 0xA8F5)
{
*uniSyl = kscSyl - 0xA8E7 + 0x2460;
return true;
}
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
bool
hccKSC2Uni_BlockA9(unsigned short kscSyl, wchar_t *uniSyl)
{
switch (kscSyl)
{
case 0xA9A1:
*uniSyl = 0x00E6; return true;
case 0xA9A2:
*uniSyl = 0x0111; return true;
case 0xA9A3:
*uniSyl = 0x00F0; return true;
case 0xA9A4:
*uniSyl = 0x0127; return true;
case 0xA9A5:
*uniSyl = 0x0131; return true;
case 0xA9A6:
*uniSyl = 0x0133; return true;
case 0xA9A7:
*uniSyl = 0x0138; return true;
case 0xA9A8:
*uniSyl = 0x0140; return true;
case 0xA9A9:
*uniSyl = 0x0142; return true;
case 0xA9AA:
*uniSyl = 0x00F8; return true;
case 0xA9AC:
*uniSyl = 0x00DF; return true;
case 0xA9AD:
*uniSyl = 0x00FE; return true;
case 0xA9AE:
*uniSyl = 0x0167; return true;
case 0xA9AF:
*uniSyl = 0x014B; return true;
case 0xA9B0:
*uniSyl = 0x0149; return true;
case 0xA9FA:
*uniSyl = 0x207F; return true;
case 0xA9F6:
*uniSyl = 0x00B9; return true;
case 0xA9F7:
*uniSyl = 0x00B2; return true;
case 0xA9F8:
*uniSyl = 0x00B3; return true;
}
if (kscSyl >= 0xA9B1 && kscSyl <= 0xA9CC)
{
*uniSyl = kscSyl - 0xA9B1 + 0x3200;
return true;
}
if (kscSyl >= 0xA9CD && kscSyl <= 0xA9E6)
{
*uniSyl = kscSyl - 0xA9CD + 0x249C;
return true;
}
if (kscSyl >= 0xA9E7 && kscSyl <= 0xA9F5)
{
*uniSyl = kscSyl - 0xA9E7 + 0x2474;
return true;
}
if (kscSyl >= 0xA9FB && kscSyl <= 0xA9FE)
{
*uniSyl = kscSyl - 0xA9FB + 0x2081;
return true;
}
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
bool
hccKSC2Uni_BlockAAAB(unsigned short kscSyl, wchar_t *uniSyl)
{
if (kscSyl >= 0xAAA1 && kscSyl <= 0xAAF3)
{
*uniSyl = kscSyl - 0xAAA1 + 0x3041;
return true;
}
else if (kscSyl >= 0xABA1 && kscSyl <= 0xABF6)
{
*uniSyl = kscSyl - 0xABA1 + 0x30A1;
return true;
}
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
bool
hccKSC2Uni_BlockAC(unsigned short kscSyl, wchar_t *uniSyl)
{
if (kscSyl == 0xACA7)
{
*uniSyl = 0x0401;
return true;
}
else if (kscSyl == 0xACD7)
{
*uniSyl = 0x0451;
return true;
}
else if (kscSyl >= 0xACA1 && kscSyl <= 0xACA6)
{
*uniSyl = kscSyl - 0xACA1 + 0x0410;
return true;
}
else if (kscSyl >= 0xACA8 && kscSyl <= 0xACC1)
{
*uniSyl = kscSyl - 0xACA8 + 0x0416;
return true;
}
else if (kscSyl >= 0xACD1 && kscSyl <= 0xACD6)
{
*uniSyl = kscSyl - 0xACD1 + 0x0430;
return true;
}
else if (kscSyl >= 0xACD8 && kscSyl <= 0xACF1)
{
*uniSyl = kscSyl - 0xACD8 + 0x0436;
return true;
}
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
bool
hccKSC2Uni_BlockA1A2(unsigned short kscSyl, wchar_t *uniSyl)
{
int idx;
unsigned short uiSyl;
if (kscSyl >= 0xa1a1 && kscSyl <= 0xa1ff)
{
idx = kscSyl - 0xa1a0;
if (idx >= NUMOF_KSC_A1 || idx < 0)
{
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
uiSyl = hctbl_KSC2UNI_BLOCK_A1[idx];
if (uiSyl == 0xffff)
{
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
else
{
*uniSyl = uiSyl;
return true;
}
}
else if (kscSyl >= 0xa2a0 && kscSyl <= 0xa2ef)
{
idx = kscSyl - 0xa2a0;
if (idx >= NUMOF_KSC_A2 || idx < 0)
{
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
uiSyl = hctbl_KSC2UNI_BLOCK_A2[idx];
if (uiSyl == 0xffff)
{
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
else
{
*uniSyl = uiSyl;
return true;
}
}
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
bool
hccKSC2Uni_BlockA6(unsigned short kscSyl, wchar_t *uniSyl)
{
int idx;
unsigned short uiSyl;
if (kscSyl >= 0xA6A0 && kscSyl <= 0xA6FF)
{
idx = kscSyl - 0xA6A0;
if (idx < 0 || idx >= NUMOF_KSC_A6)
{
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
uiSyl = hctbl_KSC2UNI_BLOCK_A6[idx];
if (uiSyl == 0xffff)
{
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
*uniSyl = uiSyl;
return true;
}
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
bool
hccKSC2Uni_BlockA7(unsigned short kscSyl, wchar_t *uniSyl)
{
int idx;
unsigned short uiSyl;
if (kscSyl >= 0xA7A0 && kscSyl <= 0xA7FF)
{
idx = kscSyl - 0xA7A0;
if (idx < 0 || idx >= NUMOF_KSC_A7)
{
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
uiSyl = hctbl_KSC2UNI_BLOCK_A7[idx];
if (uiSyl == 0xffff)
{
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
*uniSyl = uiSyl;
return true;
}
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
bool
hccKSC2UniSyl(unsigned short kscSyl, wchar_t *uniSyl)
{
structHSyl tgSyl;
unsigned short uniCHO;
unsigned short uniJUNG;
unsigned short uniJONG;
// KS C 5601 Block A1 - A2
if (kscSyl >= 0xa1a0 && kscSyl <= 0xa2ff)
{
if (hccKSC2Uni_BlockA1A2(kscSyl, uniSyl) == false)
{
return false;
}
else
{
return true;
}
}
// KS C 5601: Block A3 [Full-width]
else if (kscSyl >= 0xA3A0 && kscSyl <= 0xA3FE)
{
if (kscSyl == 0xA3FF)
return false;
*uniSyl = kscSyl - 0xA3A0 + 0x0020;
return true;
}
// KS C 5601: Block A4 [JAMO-Syllable]
else if (kscSyl >= 0xA4A0 && kscSyl <= 0xA4FF)
{
if (kscSyl == 0xA4A0 || kscSyl == 0xA4FF)
return false;
*uniSyl = kscSyl - 0xA4A1 + 0x3131;
return true;
}
// KS C 5601: Block A5 [Roman/Greek]
else if (kscSyl >= 0xA5A0 && kscSyl <= 0xA5FF)
{
// KS C 5601: Roman Alphabet - Number
if (kscSyl >= 0xA5A1 && kscSyl <= 0xA5AA)
{
*uniSyl = kscSyl - 0xA5A1 + 0x2170;
return true;
}
// KS C 5601: Roman Alphabet - Number
else if (kscSyl >= 0xA5B0 && kscSyl <= 0xA5B9)
{
*uniSyl = kscSyl - 0xA5B0 + 0x2160;
return true;
}
// KS C 5601: Basic Greek Alphabet
else if (kscSyl >= 0xA5C1 && kscSyl <= 0xA5D1)
{
*uniSyl = kscSyl - 0xA5C1 + 0x0391;
return true;
}
else if (kscSyl >= 0xA5D2 && kscSyl <= 0xA5D8)
{
*uniSyl = kscSyl - 0xA5D2 + 0x03A3;
return true;
}
else if (kscSyl >= 0xA5E1 && kscSyl <= 0xA5F1)
{
*uniSyl = kscSyl - 0xA5E1 + 0x03B1;
return true;
}
else if (kscSyl >= 0xA5F2 && kscSyl <= 0xA5F8)
{
*uniSyl = kscSyl - 0xA5F2 + 0x03C3;
return true;
}
return false;
}
// Block A6
else if (kscSyl >= 0xA6A0 && kscSyl <= 0xA6FF)
{
if (hccKSC2Uni_BlockA6(kscSyl, uniSyl) == true)
return true;
else
return false;
}
// Block A7
else if (kscSyl >= 0xA7A0 && kscSyl <= 0xA7FF)
{
if (hccKSC2Uni_BlockA7(kscSyl, uniSyl) == true)
return true;
else
return false;
}
// Block A8
else if (kscSyl >= 0xA8A0 && kscSyl <= 0xA8FF)
{
if (hccKSC2Uni_BlockA8(kscSyl, uniSyl) == true)
return true;
else
return false;
}
// Block A9
else if (kscSyl >= 0xA9A0 && kscSyl <= 0xA9FF)
{
if (hccKSC2Uni_BlockA9(kscSyl, uniSyl) == true)
return true;
else
return false;
}
// Block AA - AB
else if (kscSyl >= 0xAAA0 && kscSyl <= 0xABFF)
{
if (hccKSC2Uni_BlockAAAB(kscSyl, uniSyl) == true)
return true;
else
return false;
}
// Block AC
else if (kscSyl >= 0xACA0 && kscSyl <= 0xACFF)
{
if (hccKSC2Uni_BlockAC(kscSyl, uniSyl) == true)
return true;
else
return false;
}
// Check if KSC 5601: 2,350 Chars
if (kscSyl >= 0xB0A0 && kscSyl <= 0xC8FF)
{
// Check if Microsoft Unified Hangul
if ( ((kscSyl & 0x00ff) <= 0x00A0) || ((kscSyl & 0x00ff) == 0x00ff))
{
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
tgSyl.hCode = ConvertKS2TGSyl(kscSyl);
if (tgSyl.hCode == HCTBL_NOT_FOUND)
{
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
uniCHO = tgSyl.hPhoneme.hCho - 0x02;
uniJUNG = hctbl_KSSM2UNI_JUNG[tgSyl.hPhoneme.hJung];
uniJONG = hctbl_KSSM2UNI_JONG[tgSyl.hPhoneme.hJong];
*uniSyl = 0xAC00 + (uniCHO * 588) + uniJUNG * 28 + uniJONG;
return true;
}
*uniSyl = KSC2UNI_DEFAULT_CHAR;
return false;
}
bool
hccUni2KSCSyl(wchar_t uniSyl, unsigned char *kscSyl)
{
unsigned short uniCHO;
unsigned short uniJUNG;
unsigned short uniJONG;
unsigned short kssmCHO;
unsigned short kssmJUNG;
unsigned short kssmJONG;
structHSyl hSyl;
unsigned short uiSyl;
// If [Hangul Compatibility Jamo]
if (uniSyl >= 0x3131 && uniSyl <= 0x318E )
{
uiSyl = (uniSyl - 0x3131) + 0xA4A1;
*kscSyl = uiSyl >> 8;
*(kscSyl+1) = uiSyl & 0x00ff;
*(kscSyl+2) = '\0';
return true;
}
// Check if [Hangul]
if (uniSyl < 0xAC00 || uniSyl > 0xD79F)
return false;
//uniCHO = ((uniSyl - 0xAC00) / (21 * 28) );
uniCHO = ((uniSyl - 0xAC00) / 588 );
//uniJUNG = ((uniSyl - 0xAC00) % (21 * 28)) / 28;
uniJUNG = ((uniSyl - 0xAC00) % 588) / 28;
uniJONG = (uniSyl - 0xAC00) % 28;
kssmCHO = uniCHO + 0x0002;
kssmJUNG = hctbl_UNI2KSSM_JUNG[uniJUNG];
kssmJONG = hctbl_UNI2KSSM_JONG[uniJONG];
HAN_COMBI(hSyl, kssmCHO, kssmJUNG, kssmJONG);
uiSyl = ConvertTG2KSSyl(hSyl.hCode);
if (uiSyl == HCTBL_NOT_FOUND)
return false;
*kscSyl = uiSyl >> 8;
*(kscSyl+1) = uiSyl & 0x00ff;
*(kscSyl+2) = '\0';
return true;
}
//***********************************************
//
// AU-System requests the following APIs
//
//***********************************************
int
KSCStrLenOfUni(wchar_t *uStr)
{
int kscLen = 0;
int i;
unsigned short uiCHO;
unsigned short uiJUNG;
unsigned short uiJONG;
unsigned short kssmCHO;
unsigned short kssmJUNG;
unsigned short kssmJONG;
structHSyl hSyl;
if (! uStr)
return kscLen;
for (i = 0; uStr[i] != 0x0000; i++)
{
//if (uStr[i] >= 0x0020 && uStr[i] <= 0x007e)
if (uStr[i] >= 0x0001 && uStr[i] <= 0x007e)
kscLen++;
else if (uStr[i] >= 0xac00 && uStr[i] <= 0xd7a3)
{
uiCHO = (uStr[i] - 0xAC00) / 588;
uiJUNG = ( (uStr[i] - 0xAC00) % 588 ) / 28;
uiJONG = (uStr[i] - 0xAC00) % 28;
kssmCHO = uiCHO + 0x0002;
kssmJUNG = hctbl_UNI2KSSM_JUNG[uiJUNG];
kssmJONG = hctbl_UNI2KSSM_JONG[uiJONG];
HAN_COMBI(hSyl, kssmCHO, kssmJUNG, kssmJONG);
// Changed by AU-System
// if (ConvertTG2KSSyl(hSyl.hCode == HCTBL_NOT_FOUND))
if (ConvertTG2KSSyl((unsigned short)(hSyl.hCode == HCTBL_NOT_FOUND)))
kscLen += 4;
else
kscLen += 2;
}
else
kscLen += 2;
}
return kscLen;
}
int
UniLenOfKSCStr(char *kStr)
{
int uniLen = 0;
int i;
if (! kStr)
return uniLen;
for (i = 0, uniLen = 0; kStr[i] != '\0'; i++, uniLen++)
{
if (kStr[i] & 0x80)
i++;
}
return uniLen;
}
INT32
KSC2Unicode_calcLen(BYTE *str, BOOL isNullTerminated, UINT32 readBytes, UINT32 *strByteLen)
{
int iLen;
if (isNullTerminated == TRUE)
{
*strByteLen = (UINT32) strlen((char *) str);
iLen = UniLenOfKSCStr((char *) str);
}
else
{
/* Removed by AU-System
// In case that the 'str' does not terminate with the NULL character
pStr = (char *) malloc(sizeof(char) * readBytes);
memcpy(pStr, str, readBytes);
pStr[readBytes] = '\0';
iLen = UniLenOfKSCStr(pStr);
free(pStr);
*strByteLen = readBytes;
pStr = NULL;
Added by AU-System */
UINT32 i;
*strByteLen = readBytes;
if (! str)
{
for (i = 0, iLen = 0; i < readBytes; i++, iLen++)
{
if (str[i] & 0x80)
i++;
}
}
}
return iLen;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -