한자한글 변환기

cppig1995의 이미지

마소리스님의 변환기가 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파일은 모두 정상이고, 잘 읽히는 것 같습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.