피보나치
2008-12-01 18:01:01
3
64806

자바 한글 인코딩 변환 UTF-8 -MS949 -> UTF-8 한글이 깨져요 ㅡㅜ


UTF-8 -> MS949 -> UTF-8

이런식으로 인코딩 변환할 경우에 한글이 깨져 버리게 되는데요.

무엇이 원인인지 정확히 몰라 선배님들께 조언을 구합니다.

 

일단 MS949인코딩의 자바 파일을 사용할수 밖에 없는 상황이구요

먼저 다음과 같은 테스트를 해보았습니다.

String utf8String = new String("똠방각하.".getBytes("UTF-8"));  
System.out.println(new String(utf8String.getBytes(), "UTF-8"));
System.out.println(new String(utf8String.getBytes(), "MS949"));

 

첫번째 결과는 "?방각?" 이런식으로 나오구요

두번째 결과는 당연히 알수 없는 혼돈의 글자들이 출현합니다.

 

마치 MS949파일을 CP949파일로 변환하면서 글자들이 손실된 것 같은 느낌을 주는데요,

언뜻 찾아보니 위키피디아에선 자바에서 쓰이는 UTF-8은 변형된 UTF-8로 웹문서의 UTF-8과는 또 다르다고 하네요.

 

그래서 일단 어디서 손실되는지를 알아보기 위해 다음과 같이 해보았습니다.

 

에디트 플러스를 이용해 UTF-8 형식의 파일에 "똠방각하"를 넣고 다음과 같은 소스를 이용해 UTF-8의 값을 읽고 위와 같은 방식으로 얻

은 내용을 동시에 저장하였습니다.(물론 소스코드의 인코딩은 MS949입니다)

 

BufferedReader in = new BufferedReader(new InputStreamReader(
     new FileInputStream("in(utf8).txt")));
  
   BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
     new FileOutputStream("out(utf8).txt")));

   String s;

   s = in.readLine();
   in.close();
   out.write(s);  
   String utf8String = new String("똠방각하".getBytes("UTF-8"));
   out.newLine();
   out.write(utf8String);
   out.close();

 

둘의 결과가 똑같이 "?방각?"으로 나오는 것으로 보아 UTF-8을 MS949로 변환하면서 손실이 발생하는 것 같습니다.

반대로 MS949인 한글을 UTF-8로 변환해 바로 저장했을때도 손실이 발생하였습니다.

 

위 코드는 단순히 테스트만을 위한것이었고 실제로는 맨처음과 같이 사용하고 싶은건데요,

손실없이 MS949 - UTF-8 상호 변환 가능한 방법 알고계시는 선배님들께 조언을 구해봅니다.

0
  • 답변 3

  • 허허실실
    2008-12-01 22:56:39
    String.getBytes(String charsetName) 를 사용하새요.
    getBytes() 는 platform의 default charset으로 byte[] 리턴합니다.
    utf8String 가 utf-8로 인코딩되어 있으면 getBytes에서도 utf-8로 리턴해야합니다.
  • 피보나치
    2008-12-02 13:32:57
    간단하게 줄이면 다음과 같은 소스를 돌려보심이 괜찮을 듯 파일 인코딩은 MS949입니다
    String a1 = "?c방각하";
    System.out.println(a1);
    String a2 = new String(a1.getBytes("MS949"),"UTF-8");
    System.out.println(a2);
    String a3 = new String(a2.getBytes("UTF-8"),"MS949");
    System.out.println(a3);
  • 피보나치
    2008-12-02 15:03:59
    ㄸ방각하 댓글에서 깨지는 군용 ㅡㅜ

  • 로그인을 하시면 답변을 등록할 수 있습니다.