한자한글 변환기
글쓴이: 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:
댓글 달기