제목데로 영어로 입력된 String을 한글로 바꾸는 자바 Class이다.

회사 소스를 정리하던 중 다소 오래된 코드긴 한데 꽤 괜찮아서 올린다.

내가 만든 코드도 아니고 네이버 지식인에서 유입된 코드인듯 하다.


/**
 * 영문으로 입력된 키보드 문자을 한글로 변환하는 클래스이다.
 * 이는 암호입력시 입력되는 영문 키보드 문자를 한글로 변환하여 
 * 이를 다른 한글과 비교하기 위함이다.
 * 
 * 아래의 개작 소스에 추가로 숫자, 특수문자, 기호등을 추가로 처리하도록 
 * 수정하였다.
 * 
 * 제약사항은 초성만 존재하거나 삼벌식은 지원하지 않는다.
 * 
 * 다음의 원저작자와 이를 Java 모듈로 변환한 개작자이다.
 * 원소스 : 자바스크립트 버젼 영한오토마타 / ROKAF CC 568th 김건호
 * 개    작 : 자바 컨버젼 / 박영민 06. 8. 1
 */
public class ConvertEntoKo {
	// 코드타입 - 초성, 중성, 종성
	static enum CodeType {
		chosung, jungsung, jongsung
	}
	
	static String ignoreChars = "`1234567890-=[]\\;',./~!@#$%^&*()_+{}|:\"<>? ";

	/**
	 * 영어를 한글로...
	 */
	public static String engToKor(String eng) {
		StringBuffer sb = new StringBuffer();
		int initialCode = 0, medialCode = 0, finalCode = 0;
		int tempMedialCode, tempFinalCode;

		for (int i = 0; i < eng.length(); i++) {
			// 숫자특수문자 처리
			if(ignoreChars.indexOf(eng.substring(i, i + 1)) > -1){
				sb.append(eng.substring(i, i + 1));
				continue;
			}
			// 초성코드 추출
			initialCode = getCode(CodeType.chosung, eng.substring(i, i + 1));
			i++; // 다음문자로

			// 중성코드 추출
			tempMedialCode = getDoubleMedial(i, eng); // 두 자로 이루어진 중성코드 추출

			if (tempMedialCode != -1) {
				medialCode = tempMedialCode;
				i += 2;
			} else { // 없다면,
				medialCode = getSingleMedial(i, eng); // 한 자로 이루어진 중성코드 추출
				i++;
			}

			// 종성코드 추출
			tempFinalCode = getDoubleFinal(i, eng); // 두 자로 이루어진 종성코드 추출
			if (tempFinalCode != -1) {
				finalCode = tempFinalCode;
				// 그 다음의 중성 문자에 대한 코드를 추출한다.
				tempMedialCode = getSingleMedial(i + 2, eng);
				if (tempMedialCode != -1) { // 코드 값이 있을 경우
					finalCode = getSingleFinal(i, eng); // 종성 코드 값을 저장한다.
				} else {
					i++;
				}
			} else { // 코드 값이 없을 경우 ,
				tempMedialCode = getSingleMedial(i + 1, eng); 
                                // 그 다음의 중성 문자에 대한 코드 추출.
				if (tempMedialCode != -1) { // 그 다음에 중성 문자가 존재할 경우,
					finalCode = 0; // 종성 문자는 없음.
					i--;
				} else {
					finalCode = getSingleFinal(i, eng); // 종성 문자 추출
					if (finalCode == -1){
						finalCode = 0;
						i--; // 초성,중성 + 숫자,특수문자,
                                                     //기호가 나오는 경우 index를 줄임.
					}
				}
			}
			// 추출한 초성 문자 코드, 
                        //중성 문자 코드, 종성 문자 코드를 합한 후 변환하여 스트링버퍼에 넘김
			sb.append((char) (0xAC00 + initialCode + medialCode + finalCode));
		}
		return sb.toString();
	}

	/**
	 * 해당 문자에 따른 코드를 추출한다.
	 * 
	 * @param type
	 *            초성 : chosung, 중성 : jungsung, 종성 : jongsung 구분
	 * @param char 해당 문자
	 */
	static private int getCode(CodeType type, String c) {
		// 초성
		String init = "rRseEfaqQtTdwWczxvg";
		// 중성
		String[] mid = { "k", "o", "i", "O", "j", "p", "u", "P", "h", "hk",
				"ho", "hl", "y", "n", "nj", "np", "nl", "b", "m", "ml", "l" };
		// 종성
		String[] fin = { "r", "R", "rt", "s", "sw", "sg", "e", "f", "fr", "fa",
				"fq", "ft", "fx", "fv", "fg", "a", "q", "qt", "t", "T", "d",
				"w", "c", "z", "x", "v", "g" };

		switch (type) {
		case chosung:
			int index = init.indexOf(c);
			if (index != -1) {
				return index * 21 * 28;
			}
			break;
		case jungsung:

			for (int i = 0; i < mid.length; i++) {
				if (mid[i].equals(c)) {
					return i * 28;
				}
			}
			break;
		case jongsung:
			for (int i = 0; i < fin.length; i++) {
				if (fin[i].equals(c)) {
					return i + 1;
				}
			}
			break;
		default:
			System.out.println("잘못된 타입 입니다");
		}

		return -1;
	}

	// 한 자로 된 중성값을 리턴한다
	// 인덱스를 벗어낫다면 -1을 리턴
	static private int getSingleMedial(int i, String eng) {
		if ((i + 1) <= eng.length()) {
			return getCode(CodeType.jungsung, eng.substring(i, i + 1));
		} else {
			return -1;
		}
	}

	// 두 자로 된 중성을 체크하고, 있다면 값을 리턴한다.
	// 없으면 리턴값은 -1
	static private int getDoubleMedial(int i, String eng) {
		int result;
		if ((i + 2) > eng.length()) {
			return -1;
		} else {
			result = getCode(CodeType.jungsung, eng.substring(i, i + 2));
			if (result != -1) {
				return result;
			} else {
				return -1;
			}
		}
	}

	// 한 자로된 종성값을 리턴한다
	// 인덱스를 벗어낫다면 -1을 리턴
	static private int getSingleFinal(int i, String eng) {
		if ((i + 1) <= eng.length()) {
			return getCode(CodeType.jongsung, eng.substring(i, i + 1));
		} else {
			return -1;
		}
	}

	// 두 자로된 종성을 체크하고, 있다면 값을 리턴한다.
	// 없으면 리턴값은 -1
	static private int getDoubleFinal(int i, String eng) {
		if ((i + 2) > eng.length()) {
			return -1;
		} else {
			return getCode(CodeType.jongsung, eng.substring(i, i + 2));
		}
	}
	
	public static void main(String[] args) {
		System.out.println(ConvertEntoKo.engToKor("zjavbxjfmf tkTek."));
		// 컴퓨터를 샀다.
	}

}
Posted by 오달봉
,