한자한글 변환기
글쓴이: cppig1995 / 작성시간: 수, 2007/02/14 - 9:54오후
마소리스님의 변환기가 win32콘솔에서 동작하지 않아 직접 만들고 있습니다.
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
bool looping = true, useuni = false, reversed = false, flag_setmode = false;
vector<string> dicuni_src, dicuni_des, dic_src, dic_des;
string interpret(string);
int readdic(const char *);
void setmode(int = -1);
void replaceAll(string &, const string &, const string &);
int main()
{
setmode(1);
cout << "**& 푸른돼지의 한자-한글 변환기 0.01 &**\n\n";
cout << "프로그램 제작자: 푸른돼지 돼지군(cppig1995@gmail.com)\n";
cout << "변환 DB 제작: 마소리스(masoris@gmail.com)님\n";
cout << endl;
int i = 1;
string str;
while(looping)
{
cout << "入力" << i << "> ";
cin >> str;
cout << "出力" << i << "> " << interpret(str) << endl;
i++;
}
}
string interpret(string str)
{
if(str == "" || str == "&도움" || str == "&help") return "변환할 문자열 혹은 명령어를 입력해 주십시오.\n"
"(&종료/&exit, &한자한글/&정변환/&hjhg, &한글한자/&역변환/&hghj,\n"
" &방식/&형식/&변환방식/&변환형식/&type, &도움/&help)";
else if(str == "&종료" || str == "&exit")
{
looping = false;
return "종료합니다.";
}
else if(str == "&한자한글" || str == "&정변환" || str == "&hjhg")
{
reversed = false;
return "지금부터 한자를 한글로 변환합니다. (정변환)";
}
else if(str == "&한글한자" || str == "&역변환" || str == "&hghj")
{
reversed = true;
return "지금부터 한글을 한자로 변환합니다. (역변환)";
}
else if(str == "&방식" || str == "&형식" || str == "&변환방식" || str == "&변환형식" || str == "&type")
{
setmode();
return "{ 명령이 처리되었습니다. }";
}
else
{
if(useuni) for(int i = 0; i < dicuni_src.size(); i++) replaceAll(str, dicuni_src[i], dicuni_des[i]);
if(reversed) for(int i = 0; i < dic_src.size(); i++) replaceAll(str, dic_des[i], dic_src[i]);
else for(int i = 0; i < dic_src.size(); i++) replaceAll(str, dic_src[i], dic_des[i]);
}
return str;
}
int readdic(const char *fn)
{
cout << "파일 " << fn << "을 읽어들이는 중... ";
FILE *fin = fopen(fn, "rt");
if(!fin)
{
cout << "파일 읽기 실패.\n올바른 사전 파일이 있는지 확인하십시오." << endl;
if(flag_setmode)
{
cout << "현재 진행 중인 방식 변경 또한 중단됩니다." << endl;
flag_setmode = false;
}
return 1;
}
int i = 0;
char buf1[100], buf2[100];
while(fscanf(fin, "%s %s\n", buf1, buf2) == 2)
{
dic_src.push_back(buf1);
dic_des.push_back(buf2);
i++;
}
cout << i << "개의 데이터를 읽어 들였습니다." << endl;
return 0;
}
void setmode(int mode)
{
flag_setmode = true;
if(mode == -1)
{
cout << "변환하고자 하는 방식을 선택하세요." << endl;
cout << " [1] 다용도 한자-한글 변환 시스템 (권장/기본값)" << endl;
cout << " [2] 유니코드 대표음으로 변환 (MS 워드)" << endl;
cout << " [3] 유니코드 정규화 알고리즘 적용 후 한글로 변환 (위키백과)" << endl;
cout << " [4] 두음 법칙을 적용하지 않는 한글로 변환 (북조선 문화어)" << endl;
cout << " [5] 한자에 유니코드 정규화 알고리즘 적용" << endl;
cout << "변환하고자 하는 방식은: ";
string strmode;
cin >> strmode;
if(strmode == "1") mode = 1;
else if(strmode == "2") mode = 2;
else if(strmode == "3") mode = 3;
else if(strmode == "4") mode = 4;
else if(strmode == "5") mode = 5;
else
{
cout << "잘못된 입력입니다. (올바른 입력은 1-5 사이의 숫자 값입니다.)" << endl;
setmode();
return;
}
}
readdic("hjchju.dic");
dicuni_src = dic_src;
dicuni_des = dic_des;
dic_src.clear();
dic_des.clear();
useuni = false;
if(mode == 1)
{
if(readdic("hjword.dic")) return;
if(readdic("hjc2hg.dic")) return;
if(readdic("hju2hg.dic")) return;
cout << "1번(다용도) 방식으로 변경되었습니다." << endl;
}
if(mode == 2)
{
if(readdic("hjc2hg.dic")) return;
if(readdic("hju2hg.dic")) return;
cout << "2번(MS 워드) 방식으로 변경되었습니다." << endl;
}
if(mode == 3)
{
if(readdic("hjword.dic")) return;
if(readdic("ndueum.dic")) return;
useuni = true;
cout << "3번(위키백과) 방식으로 변경되었습니다." << endl;
}
if(mode == 4)
{
if(readdic("ndueum.dic")) return;
cout << "4번(문화어) 방식으로 변경되었습니다." << endl;
}
if(mode == 5)
{
if(readdic("hjchju.dic")) return;
cout << "5번(한자정규화) 방식으로 변경되었습니다." << endl;
}
flag_setmode = false;
}
void replaceAll(string &str, string from, string to)
{
string::size_type i;
while((i = str.find(from)) != str.npos) str.replace(i, from.size(), to);
}이렇게 짰는데 변환이 안되네요.
dic파일은 모두 정상이고, 잘 읽히는 것 같습니다.
Forums:


댓글 달기