컴퓨터 엑셀 워드 포토숍 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Previous Post 배치파일] 요일 출력, 오늘 현재 요일만 구하기; Get DAY OF THE WEEK St...배치파일] 요일 삭제, 날짜 문자열에서 요일 지우기; Remove DAY OF THE WE...배치파일/Batch File] args / argc, argv 파라미터(인수; 매개변수) ...낫표 겹낫표 기호 입력; 에디터/MS워드, 낫표 괄호 넣기 「」『』; Corner Brac...C언어] argc, argv 파라미터(인수; 매개변수) 사용 예제; main Functio...Java/자바] 16진수 상수 FF, 10 표현 방법; Hexadecimal Literal...텍스트 브라우저, 리눅스/윈도우용; Text Browse LYNX도스박스/도스창 전체 화면 모드 핫키; DOSBox, DOS Full-Screen Hot ...배치파일 텍스트 출력 방법. 글자,문자열 쓰기, 프린트 함수; Batch File Prin...배치파일 예약어, 키워드 목록; Batch File Keyword List

자바/Java] 한글 자소 분리 + 유니코드(UTF-8) 파일로 읽고 쓰기 버전; hangulToJaso

Thursday, December 14, 2006

이 게시물에 있는 소스는, "유니코드(UTF-8)로 된 파일"을 입력받아서, 자소를 분리한 후 유니코드(UTF-8)로 된 파일로 저장합니다.

즉, 입출력이 모두 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;
  }


}


위의 소스 자체는 그냥 완성형으로 저장하면 되고, 유니코드일 필요는 없습니다.


☞ 자바(Java)

5 Comments:
At 11:23 AM, Anonymous 도둑고양이s said...

오늘 하루내 한글문제로 삽질하다가 마지막관문에서 이 소스의 도움으로 작업들을 모두 마무리 지었습니다. ^^;
참고할 만한 자료라서 제 블로그에 퍼갔어요. ㅋㅋ
불펌이라 삭제를 원하시면 글 남겨주세요.

 
At 2:48 PM, Anonymous lsh said...

좋은정보 감사합니다~
제 블로그에 가져가도 될까요?

 
At 6:28 PM, Blogger mwultong said...

퍼가시지 마시고 링크를 해주세요

 
At 11:25 PM, Blogger kgcrom said...

안녕하세요.
작성해주신 소스 잘봤습니다.
몇개 수정해서 제블로그에 올리려고하는데
괜찮으시간요?
물론 원본 링크는 적겠습니다.

 
At 8:38 AM, Blogger mwultong said...

예, 괜찮습니다

 

Post a Comment

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Categories
Previous Posts
Monthly Archives
Top