제목데로 영어로 입력된 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 오달봉
,


Apache Common httpclient를 쓴다는 의미는 대부분 로직단에서 OpenAPI 같은걸 호출하고 있다는 의미라서 String이나 Base64타입의 파라메터들을 사용하게 일반적이다.

부끄럽지만 나도 그런편이라 처음으로 파일을 파라메터로 날려야 할 상황이 생겨서 조금은 난감했다.

결과적으로 파일 객체를 FilePart 객체에 넣어서 PostMethod객체의 RequestEntry에 넣어주면 된다.

말이 어려우니깐 쉽게 소스로 풀어보자.


import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.StringPart;

public class TestPost {
		
	public void sendPostFile(){
		String url = "http://localhost:8080/testblabla/acceptFile.do"; //걍 테스트용으로 대충 만든 URL
		
		PostMethod post = new PostMethod(url); //Post 객체 하나 만듬. 
		HttpClient client = new HttpClient();
		int statusCode;
		String resposeMessage = null;
		
		try {
			List parts = new ArrayList(); // Paramater들을 넣을 리스트 객체 하나 만들고~
			parts.add(new StringPart("saveDirectory", "shared")); //대충 파일외에 String Param이 있다고 가정.......

			File file = new File("./test.txt"); // 날릴 파일 
			parts.add(new FilePart("saveFile", "test.txt", file)); //객체생성자는 param명, 파일이름, 파일 객체 순으로...
			
			post.setRequestEntity(new MultipartRequestEntity((Part[])parts.toArray(new Part[parts.size()]), post.getParams())); 
			//파일을 전송하야 하니 당연히 Multipart타입으로~
			
			client.getHttpConnectionManager().getParams().setConnectionTimeout(5000); //접속~
			statusCode = client.executeMethod(post); //http 응답 Status값 받기(200, 404, 500등등)
			resposeMessage = post.getResponseBodyAsString(); // 요청에 대한 응답 메시지가 있다고 가정 
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			post.releaseConnection();
		}
	}
}

 


 

 


 


Posted by 오달봉
,

vim -b {filename}

이렇게 파일을 열어

:%s/^M//g

입력하여 지운다. 하지만 ^M이렇게 입력하는 것이 아니라 CTRL+V, CTRL+M 을 순서대로 입력하여 넣어야 된다는 점이다.

Posted by 오달봉
,