Codebreaker 2bc08752a0894eb2c7afb345286e391d

27Jun/069

한글 자소 분리

레몬향기혜성님이 쓴 포스트를 보고 Java 로 conversion 해봤다.

학교 도서관 컴퓨터로 프로그래밍 하는 일은 그다지 유쾌한 일이 아니다. 개발도구가 설치되어있지 않음은 물론이고 Administrator Privilege 도 없어서 소프트웨어를 마음대로 설치할 수 없다. 그래도 다행인것은 Eclipse는 설치하지 않고 실행이 가능하다는 점과, Mac 에서는 Netbeans 도 설치하지 않고 실행할 수 있다는 점이다.

아무튼, 이 클래스는 도서관에 있는 Power Mac 으로 힘들게;; 작성했다. 인코딩은 UTF-8 으로 설정해야 된다.

/*
 * Jaso.java
 *
 * Created on June 27, 2006, 3:12 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

import java.util.Vector;

/**
 *
 * @author guest
 */
public class Jaso {

    public static char[] ChoSeong = { 0x3131, 0x3132, 0x3134, 0x3137, 0x3138,
            0x3139, 0x3141, 0x3142, 0x3143, 0x3145, 0x3146, 0x3147, 0x3148,
            0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e };
    public static char[] JungSeong = { 0x314f, 0x3150, 0x3151, 0x3152, 0x3153,
            0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315a, 0x315b,
            0x315c, 0x315d, 0x315e, 0x315f, 0x3160, 0x3161, 0x3162, 0x3163 };
    public static char[] JongSeong = { 0x0000, 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 };

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            char[] chars = "대한민주주의공화국".toCharArray();
            Vector<character> v = new Vector<character>();

            for (int i = 0; i < chars.length; i++) {
                if (chars[i] >= 0xAC00 && chars[i] <= 0xD7A3) {
                    int i1, i2, i3;

                    i3 = chars[i] - 0xAC00;
                    i1 = i3 / (21 * 28);
                    i3 = i3 % (21 * 28);
                    i2 = i3 / 28;
                    i3 = i3 % 28;

                    v.add(ChoSeong[i1]);
                    v.add(JungSeong[i2]);
                    if (i3 != 0x0000)
                        v.add(JongSeong[i3]);
                }
                else {
                    v.add(chars[i]);
                }
            }

            System.out.println(v);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

}

결과는 다음과 같다.

[ㄷ, ㅐ, ㅎ, ㅏ, ㄴ, ㅁ, ㅣ, ㄴ, ㅈ, ㅜ, ㅈ, ㅜ, ㅇ, ㅢ, ㄱ, ㅗ, ㅇ, ㅎ, ㅘ, ㄱ, ㅜ, ㄱ]
Comments (9) Trackbacks (0)
  1. Java의 java.lang.String이 내부적으로 UTF-8 인코딩을 사용한다고 알고 있는데, 맞나요?

  2. 역시 자바의 코드가 참 명료하고 깔끔합니다.

    저도 자바를 해보려고 했는데 너무 어려워서 펄을 사용하고 있습니다..

    (∩_∩)

  3. Java의 java.lang.String이 내부적으로 UTF-8 인코딩을 사용한다고 알고 있는데, 맞나요?

    내부적으로 유니코드를 사용하는건 맞는데, 그게 UTF-8 인것 같지는 않다. 참고로 Character.SIZE == 16 (char 의 크기가 16 bits 라는 것을 의미함)

    저도 자바를 해보려고 했는데 너무 어려워서 펄을 사용하고 있습니다..

    저는 펄이 더 어려워보입니다^^;;

  4. 정말 몇줄만 치환하면 C# 에서 그대로 쓰는구나 -_-

  5. UTF-8은 가변 바이트입니다. 영어는 1byte이고 한글은 3byte이죠. utf-16 정도일 것입니다.

  6. 허헉 대단하십니다 ~_~

  7. Vector v = new Vector(); 은 뭐죠?? 첨보는거라서 지우고 Vector v = new Vector(); 이렇게 했더니 밑에 v.add(…) 에 add 오류생기네요…왜그런가요?? 가르침부탁^^;

  8. 벡터안에 중괄호가 들어가서 이상하단말이었구요 Vector v = new Vector()이렇게 고치니까 v.add(..)부분에 모두 오류가 뜨네요 오류 메세지입니다. The method add(Object) in the type Vector is not applicable for the arguments (char)

  9. Vector<Character> v = new Vector<Character>();
    

    이걸 말씀하시는것 같은데, generics 라고 하는 물건(?)입니다. C++ 쪽에선 템플릿이라고도 하죠. java generics 로 검색해보면 엄청나게 많은 문서들이 나오니까 천천히 읽어보시면 됩니다.

    원소의 자료형을 명시하지 않으면 Vector 의 자료형은 최상위 클래스인 Object 가 됩니다. char 에서 Object 로 명시적으로 형 변환을 해주지 않았기 때문에 컴파일러가 경고 메세지를 내보내는겁니다.


Leave a comment


No trackbacks yet.