344 lines
11 KiB
C++
344 lines
11 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (C) 1997, Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//#include "stdafx.h"
|
|
#include "pch.cxx"
|
|
#include "UniToInt.h"
|
|
|
|
#define NUMBER_OF_CHOSUNG 19
|
|
#define NUMBER_OF_JUNGSUNG 21
|
|
#define NUMBER_OF_JONGSUNG 28 // include fill code
|
|
|
|
#define HANGUL_COMP_JAMO_START 0x3131
|
|
#define HANGUL_COMP_JAMO_END 0x3163
|
|
#define HANGUL_COMP_JAMO_START_FILL 0x3130
|
|
#define HANGUL_COMP_JAMO_SIOT 0x3145
|
|
#define HANGUL_START 0xAC00
|
|
#define HANGUL_END 0xD7A3
|
|
|
|
///////////////////////////////////////////
|
|
// HANGUL Jaso difinitions
|
|
|
|
// ChoSung
|
|
#define KIYEOK 1
|
|
#define SSANGKIYEOK 2
|
|
#define NIEUN 3
|
|
#define SSANGNIEUN 4 // not used
|
|
#define TIKEUT 5
|
|
#define SSANGTIKEUT 6
|
|
#define RIEUL 7
|
|
#define SSANGRIEUL 8 // not used
|
|
#define MIEUM 10
|
|
#define PIEUP 11
|
|
#define SSANGPIEUP 12
|
|
#define SIOS 13
|
|
#define SSANGSIOS 14
|
|
#define IEUNG 15
|
|
#define CIEUC 16
|
|
#define SSANGCIEUC 17
|
|
#define CHIEUCH 18
|
|
#define KHIEUKH 19
|
|
#define THIEUTH 20
|
|
#define PHIEUPH 21
|
|
#define HIEUH 22
|
|
// JungSung
|
|
#define A 23
|
|
#define AE 24
|
|
#define YA 25
|
|
#define YAE 26
|
|
#define EO 27
|
|
#define E 28
|
|
#define YEO 29
|
|
#define YE 30
|
|
#define O 31
|
|
#define WA 33
|
|
#define WAE 34
|
|
#define OE 35
|
|
#define YO 36
|
|
#define U 37
|
|
#define WEO 38
|
|
#define WE 39
|
|
#define WI 40
|
|
#define YU 41
|
|
#define EU 42
|
|
#define YI 43
|
|
#define I 44
|
|
////////////////////////////////////////
|
|
|
|
// Cho sung mapping table
|
|
static
|
|
BYTE ChoSungMapTable[19] =
|
|
{
|
|
KIYEOK, SSANGKIYEOK,
|
|
NIEUN,
|
|
TIKEUT, SSANGTIKEUT,
|
|
RIEUL,
|
|
MIEUM,
|
|
PIEUP, SSANGPIEUP,
|
|
SIOS, SSANGSIOS,
|
|
IEUNG,
|
|
CIEUC, SSANGCIEUC,
|
|
CHIEUCH,
|
|
KHIEUKH,
|
|
THIEUTH,
|
|
PHIEUPH,
|
|
HIEUH,
|
|
};
|
|
|
|
// Jung sung mapping table
|
|
static
|
|
BYTE JungSungMapTable[21] =
|
|
{
|
|
A, AE, YA, YAE, EO, E, YEO, YE, O, WA, WAE, OE, YO, U, WEO, WE, WI, YU, EU, YI, I,
|
|
};
|
|
|
|
// Jong sung mapping table
|
|
static
|
|
BYTE JongSungMapTable[28][2] =
|
|
{
|
|
{ 0, 0 }, // Fill
|
|
{ KIYEOK, 0 },
|
|
{ SSANGKIYEOK, 0 },
|
|
{ KIYEOK, SIOS },
|
|
{ NIEUN, 0 },
|
|
{ NIEUN, CIEUC },
|
|
{ NIEUN, HIEUH },
|
|
{ TIKEUT, 0 },
|
|
{ RIEUL, 0 },
|
|
{ RIEUL, KIYEOK },
|
|
{ RIEUL, MIEUM },
|
|
{ RIEUL, PIEUP },
|
|
{ RIEUL, SIOS },
|
|
{ RIEUL, THIEUTH },
|
|
{ RIEUL, PHIEUPH },
|
|
{ RIEUL, HIEUH },
|
|
{ MIEUM, 0 },
|
|
{ PIEUP, 0 },
|
|
{ PIEUP, SIOS },
|
|
{ SIOS, 0 },
|
|
{ SSANGSIOS, 0 },
|
|
{ IEUNG, 0 },
|
|
{ CIEUC, 0 },
|
|
{ CHIEUCH, 0 },
|
|
{ KHIEUKH, 0 },
|
|
{ THIEUTH, 0 },
|
|
{ PHIEUPH, 0 },
|
|
{ HIEUH, 0 }
|
|
};
|
|
|
|
static
|
|
BYTE JamoMapTable[51][2] =
|
|
{
|
|
{ KIYEOK, 0 },
|
|
{ SSANGKIYEOK, 0 },
|
|
{ KIYEOK, SIOS },
|
|
{ NIEUN, 0 },
|
|
{ NIEUN, CIEUC },
|
|
{ NIEUN, HIEUH },
|
|
{ TIKEUT, 0 },
|
|
{ SSANGTIKEUT, 0 },
|
|
{ RIEUL, 0 },
|
|
{ RIEUL, KIYEOK },
|
|
{ RIEUL, MIEUM },
|
|
{ RIEUL, PIEUP },
|
|
{ RIEUL, SIOS },
|
|
{ RIEUL, THIEUTH },
|
|
{ RIEUL, PHIEUPH },
|
|
{ RIEUL, HIEUH },
|
|
{ MIEUM, 0 },
|
|
{ PIEUP, 0 },
|
|
{ SSANGPIEUP, 0 },
|
|
{ PIEUP, SIOS },
|
|
{ SIOS, 0 },
|
|
{ SSANGSIOS, 0 },
|
|
{ IEUNG, 0 },
|
|
{ CIEUC, 0 },
|
|
{ SSANGCIEUC, 0 },
|
|
{ CHIEUCH, 0 },
|
|
{ KHIEUKH, 0 },
|
|
{ THIEUTH, 0 },
|
|
{ PHIEUPH, 0 },
|
|
{ HIEUH, 0 },
|
|
//
|
|
{ A, 0 },
|
|
{ AE, 0 },
|
|
{ YA, 0 },
|
|
{ YAE, 0 },
|
|
{ EO, 0 },
|
|
{ E, 0 },
|
|
{ YEO, 0 },
|
|
{ YE, 0 },
|
|
{ O, 0 },
|
|
{ WA, 0 },
|
|
{ WAE, 0 },
|
|
{ OE, 0 },
|
|
{ YO, 0 },
|
|
{ U, 0 },
|
|
{ WEO, 0 },
|
|
{ WE, 0 },
|
|
{ WI, 0 },
|
|
{ YU, 0 },
|
|
{ EU, 0 },
|
|
{ YI, 0 },
|
|
{ I, 0 }
|
|
};
|
|
|
|
inline static
|
|
void ChosungToInternal(BYTE jamo, LPSTR lpIntStr, int &idx)
|
|
{
|
|
lpIntStr[idx++] = ChoSungMapTable[jamo];
|
|
}
|
|
|
|
inline static
|
|
void JungsungToInternal(BYTE jamo, LPSTR lpIntStr, int &idx)
|
|
{
|
|
lpIntStr[idx++] = JungSungMapTable[jamo];
|
|
}
|
|
|
|
|
|
inline static
|
|
void JongsungToInternal(BYTE jamo, LPSTR lpIntStr, int &idx)
|
|
{
|
|
if (jamo) {
|
|
lpIntStr[idx++] = JongSungMapTable[jamo][0];
|
|
if (JongSungMapTable[jamo][1])
|
|
lpIntStr[idx++] = JongSungMapTable[jamo][1];
|
|
}
|
|
}
|
|
|
|
inline static
|
|
void JamoToInternal(BYTE jamo, LPSTR lpIntStr, int &idx)
|
|
{
|
|
lpIntStr[idx++] = JamoMapTable[jamo][0];
|
|
if (JamoMapTable[jamo][1])
|
|
lpIntStr[idx++] = JamoMapTable[jamo][1];
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
BOOL UniToInvInternal(LPCWSTR lpUniStr, LPSTR _lpIntStr, int strLength)
|
|
{
|
|
int i, j, idx=0;
|
|
char lpIntStr[256]; // buffer is fixed (dangerous but quick and dirty method)
|
|
|
|
for (i=0; i<strLength; i++)
|
|
{
|
|
if (lpUniStr[i] <= HANGUL_COMP_JAMO_END && lpUniStr[i] >= HANGUL_COMP_JAMO_START)
|
|
{
|
|
JamoToInternal(BYTE(lpUniStr[i]-HANGUL_COMP_JAMO_START), lpIntStr, idx);
|
|
continue;
|
|
}
|
|
ChosungToInternal(BYTE( (WORD)(lpUniStr[i]-HANGUL_START) /
|
|
(NUMBER_OF_JONGSUNG*NUMBER_OF_JUNGSUNG) ),
|
|
lpIntStr, idx );
|
|
|
|
JungsungToInternal(BYTE( (WORD)(lpUniStr[i]-HANGUL_START) / NUMBER_OF_JONGSUNG
|
|
% NUMBER_OF_JUNGSUNG ),
|
|
lpIntStr, idx );
|
|
|
|
JongsungToInternal(BYTE( (WORD)(lpUniStr[i]-HANGUL_START) % NUMBER_OF_JONGSUNG ),
|
|
//+ NUMBER_OF_CHOSUNG + NUMBER_OF_JUNGSUNG),
|
|
lpIntStr, idx ); //jongsung
|
|
}
|
|
|
|
// inverse processing
|
|
for (i=0, j=idx-1; i<idx; i++, j--)
|
|
_lpIntStr[j] = lpIntStr[i];
|
|
_lpIntStr[idx] = 0;
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL UniToInternal(LPCWSTR lpUniStr, LPSTR lpIntStr, int strLength)
|
|
{
|
|
int i, idx=0;
|
|
// char lpIntStr[256]; // buffer is fixed (dangerous but quick and dirty method)
|
|
|
|
for (i=0; i<strLength; i++)
|
|
{
|
|
if (lpUniStr[i] <= HANGUL_COMP_JAMO_END && lpUniStr[i] >= HANGUL_COMP_JAMO_START)
|
|
{
|
|
JamoToInternal(BYTE(lpUniStr[i]-HANGUL_COMP_JAMO_START), lpIntStr, idx);
|
|
continue;
|
|
}
|
|
ChosungToInternal(BYTE( (WORD)(lpUniStr[i]-HANGUL_START) /
|
|
(NUMBER_OF_JONGSUNG*NUMBER_OF_JUNGSUNG) ),
|
|
lpIntStr, idx );
|
|
|
|
JungsungToInternal(BYTE( (WORD)(lpUniStr[i]-HANGUL_START) / NUMBER_OF_JONGSUNG
|
|
% NUMBER_OF_JUNGSUNG),
|
|
lpIntStr, idx );
|
|
|
|
JongsungToInternal(BYTE( (WORD)(lpUniStr[i]-HANGUL_START) % NUMBER_OF_JONGSUNG ),
|
|
//+ NUMBER_OF_CHOSUNG + NUMBER_OF_JUNGSUNG),
|
|
lpIntStr, idx ); //jongsung
|
|
}
|
|
lpIntStr[idx] = 0;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
BOOL UniToInvInternal(LPCWSTR lpUniStr, LPSTR _lpIntStr, int strLength)
|
|
{
|
|
int i, j, idx=0;
|
|
char lpIntStr[256]; // buffer is fixed (dangerous but quick and dirty method)
|
|
|
|
for (i=0; i<strLength; i++)
|
|
{
|
|
if (lpUniStr[i] <= HANGUL_COMP_JAMO_END && lpUniStr[i] >= HANGUL_COMP_JAMO_START)
|
|
{
|
|
if (lpUniStr[i] <= HANGUL_COMP_JAMO_SIOT)
|
|
JamoToInternal(lpUniStr[i], lpIntStr, idx);
|
|
else lpIntStr[idx++] = BYTE(lpUniStr[i] - HANGUL_COMP_JAMO_SIOT + 10);
|
|
continue;
|
|
}
|
|
lpIntStr[idx++] = BYTE( (WORD)(lpUniStr[i]-HANGUL_START) /
|
|
(NUMBER_OF_JONGSUNG*NUMBER_OF_JUNGSUNG) ) + 1;//chosung
|
|
|
|
lpIntStr[idx++] = BYTE( (WORD)(lpUniStr[i]-HANGUL_START) / NUMBER_OF_JONGSUNG
|
|
% NUMBER_OF_JUNGSUNG + NUMBER_OF_CHOSUNG ) + 1; //jungsung
|
|
|
|
JongsungToInternal(BYTE( (WORD)(lpUniStr[i]-HANGUL_START) % NUMBER_OF_JONGSUNG ),
|
|
//+ NUMBER_OF_CHOSUNG + NUMBER_OF_JUNGSUNG),
|
|
lpIntStr, idx ); //jongsung
|
|
}
|
|
|
|
// inverse processing
|
|
for (i=0, j=idx-1; i<idx; i++, j--)
|
|
_lpIntStr[j] = lpIntStr[i];
|
|
_lpIntStr[idx] = 0;
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL UniToInternal(LPCWSTR lpUniStr, LPSTR lpIntStr, int strLength)
|
|
{
|
|
int i, idx=0;
|
|
// char lpIntStr[256]; // buffer is fixed (dangerous but quick and dirty method)
|
|
|
|
for (i=0; i<strLength; i++)
|
|
{
|
|
if (lpUniStr[i] <= HANGUL_COMP_JAMO_END && lpUniStr[i] >= HANGUL_COMP_JAMO_START)
|
|
{
|
|
if (lpUniStr[i] <= HANGUL_COMP_JAMO_SIOT)
|
|
JamoToInternal(lpUniStr[i], lpIntStr, idx);
|
|
else lpIntStr[idx++] = BYTE(lpUniStr[i] - HANGUL_COMP_JAMO_SIOT + 10);
|
|
continue;
|
|
}
|
|
lpIntStr[idx++] = BYTE( (WORD)(lpUniStr[i]-HANGUL_START) /
|
|
(NUMBER_OF_JONGSUNG*NUMBER_OF_JUNGSUNG) ) + 1;//chosung
|
|
|
|
lpIntStr[idx++] = BYTE( (WORD)(lpUniStr[i]-HANGUL_START) / NUMBER_OF_JONGSUNG
|
|
% NUMBER_OF_JUNGSUNG + NUMBER_OF_CHOSUNG ) + 1; //jungsung
|
|
|
|
JongsungToInternal(BYTE( (WORD)(lpUniStr[i]-HANGUL_START) % NUMBER_OF_JONGSUNG ),
|
|
//+ NUMBER_OF_CHOSUNG + NUMBER_OF_JUNGSUNG),
|
|
lpIntStr, idx ); //jongsung
|
|
}
|
|
lpIntStr[idx] = 0;
|
|
|
|
return TRUE;
|
|
}
|
|
*/
|