Thursday, December 14, 2006
자바/Java] 한글 자소 분리 + 유니코드(UTF-8) 파일로 읽고 쓰기 버전; hangulToJaso
이 게시물에 있는 소스는, "유니코드(UTF-8)로 된 파일"을 입력받아서, 자소를 분리한 후 유니코드(UTF-8)로 된 파일로 저장합니다.
즉, 입출력이 모두 UTF-8입니다. 출력을 화면으로 하지 않고, "out.txt" 라는 이름의 UTF-8 파일로 출력합니다.
파일명: Jaso.java
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
위의 소스 자체는 그냥 완성형으로 저장하면 되고, 유니코드일 필요는 없습니다.
즉, 입출력이 모두 UTF-8입니다. 출력을 화면으로 하지 않고, "out.txt" 라는 이름의 UTF-8 파일로 출력합니다.
파일명: Jaso.java
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
import java.io.*;
////////////////////////////////////////////////////////////////////////
// 한글 문자열을 초성/중성/종성으로 분리하여 출력 (UTF-8 버전)
// v1.0
////////////////////////////////////////////////////////////////////////
class Jaso {
// ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ
final static char[] ChoSung = { 0x3131, 0x3132, 0x3134, 0x3137, 0x3138, 0x3139, 0x3141, 0x3142, 0x3143, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e };
// ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ
final static char[] JwungSung = { 0x314f, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, 0x3160, 0x3161, 0x3162, 0x3163 };
// ㄱ ㄲ ㄳ ㄴ ㄵ ㄶ ㄷ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅄ ㅅ ㅆ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ
final static char[] JongSung = { 0, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, 0x3140, 0x3141, 0x3142, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e };
public static void main(String[] args) {
if (args.length == 0) { // args.length 는 옵션 개수
System.err.println("자소 분리할 파일의 이름을 입력하세요...");
System.exit(1); // 읽을 파일명을 주지 않았을 때는 종료
}
try {
////////////////////////////////////////////////////////////////
BufferedReader in = new BufferedReader(
new InputStreamReader(
new FileInputStream(args[0]),
"UTF-8"
)
);
BufferedWriter out = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("out.txt"),
"UTF-8"
)
);
String s;
while ((s = in.readLine()) != null) {
out.write(hangulToJaso(s)); out.newLine();
}
in.close(); out.close();
////////////////////////////////////////////////////////////////
} catch (IOException e) {
System.err.println(e); // 에러가 있다면 메시지 출력
System.exit(1);
}
} // main()
public static String hangulToJaso(String s) { // 유니코드 한글 문자열을 입력 받음
int a, b, c; // 자소 버퍼: 초성/중성/종성 순
String result = "";
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch >= 0xAC00 && ch <= 0xD7A3) { // "AC00:가" ~ "D7A3:힣" 에 속한 글자면 분해
c = ch - 0xAC00;
a = c / (21 * 28);
c = c % (21 * 28);
b = c / 28;
c = c % 28;
result = result + ChoSung[a] + JwungSung[b];
if (c != 0) result = result + JongSung[c] ; // c가 0이 아니면, 즉 받침이 있으면
} else {
result = result + ch;
}
}
return result;
}
}
////////////////////////////////////////////////////////////////////////
// 한글 문자열을 초성/중성/종성으로 분리하여 출력 (UTF-8 버전)
// v1.0
////////////////////////////////////////////////////////////////////////
class Jaso {
// ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ
final static char[] ChoSung = { 0x3131, 0x3132, 0x3134, 0x3137, 0x3138, 0x3139, 0x3141, 0x3142, 0x3143, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e };
// ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ
final static char[] JwungSung = { 0x314f, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, 0x3160, 0x3161, 0x3162, 0x3163 };
// ㄱ ㄲ ㄳ ㄴ ㄵ ㄶ ㄷ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅄ ㅅ ㅆ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ
final static char[] JongSung = { 0, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, 0x3140, 0x3141, 0x3142, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e };
public static void main(String[] args) {
if (args.length == 0) { // args.length 는 옵션 개수
System.err.println("자소 분리할 파일의 이름을 입력하세요...");
System.exit(1); // 읽을 파일명을 주지 않았을 때는 종료
}
try {
////////////////////////////////////////////////////////////////
BufferedReader in = new BufferedReader(
new InputStreamReader(
new FileInputStream(args[0]),
"UTF-8"
)
);
BufferedWriter out = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("out.txt"),
"UTF-8"
)
);
String s;
while ((s = in.readLine()) != null) {
out.write(hangulToJaso(s)); out.newLine();
}
in.close(); out.close();
////////////////////////////////////////////////////////////////
} catch (IOException e) {
System.err.println(e); // 에러가 있다면 메시지 출력
System.exit(1);
}
} // main()
public static String hangulToJaso(String s) { // 유니코드 한글 문자열을 입력 받음
int a, b, c; // 자소 버퍼: 초성/중성/종성 순
String result = "";
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch >= 0xAC00 && ch <= 0xD7A3) { // "AC00:가" ~ "D7A3:힣" 에 속한 글자면 분해
c = ch - 0xAC00;
a = c / (21 * 28);
c = c % (21 * 28);
b = c / 28;
c = c % 28;
result = result + ChoSung[a] + JwungSung[b];
if (c != 0) result = result + JongSung[c] ; // c가 0이 아니면, 즉 받침이 있으면
} else {
result = result + ch;
}
}
return result;
}
}
위의 소스 자체는 그냥 완성형으로 저장하면 되고, 유니코드일 필요는 없습니다.
tag: java
자바 | Java
좋은정보 감사합니다~
제 블로그에 가져가도 될까요?
퍼가시지 마시고 링크를 해주세요
안녕하세요.
작성해주신 소스 잘봤습니다.
몇개 수정해서 제블로그에 올리려고하는데
괜찮으시간요?
물론 원본 링크는 적겠습니다.
예, 괜찮습니다
<< Home