달력

42025  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

getBytes 이해하

JAVA에서는 전세계 모든 언어를 지원하기 위해서 문자열을 Unicode로 저장한다.

하지만 아직 다양한 환경에서 UNICODE가 아니 전통적인 인코딩 방식이 사용되고 있는데,
String.getBytes() 함수를 통해서 간편하게 다른 Encoding Type으로 변환을 지원한다.

예를 들어 TCP/IP 통신 및 File I/O 등을 통해서 ISO-8859-1으로 인코딩된 문자열을 수신했을 때 적절하게 변환하여야 정상적으로 한글 출력이 된다.

사용방법 참조 http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#getBytes()

1               String chkStr2 = 1”;

2  byte [] bytes = chkStr2.getBytes( “ksc5601” );

3

4  for ( byte b : bytes )     

5  {

6      out.print(String.format("0x%02X ", b));

7  }

세부 진행 순서는 다음과 같다..
1번 라인에서 1”UTF-16BE 형식으로 아래와 같이 저장된다.
0xD55C
0x0020 0xB620 0x0020 0xD3B2 0x0031

2 라인에서는 UTF-16BEKSC5601 코드값으로 변환한다.
’ 0xD55C è 0xC7D1

‘ ‘ (공백) 0x0020 è 0x20

0xB620 è 0x3F (‘?’),  KSC5601에 포함되지 않는 확장 한글이라 ? 로 대체된다. 펲도 동일함

‘1’ 0x0031 è 0x31

따라서 출력결과는 다음과 같다. 0xC7 0xD1 0x20 0x3F 0x20 0x3F 0x20 0x31

2번라인 getBytes()에서 파라미터를 변경해서 다양한 인코딩 결과를 출력해보면 아래와 같다.

Default : 0xC7 0xD1 0x20 0x8C 0x63 0x20 0xBC 0x84 0x20 0x31   è file.encoding = ms949일때 예임. 파라미터 없이 getBytes() 호출하면 file.encoding값에 따라서 동작함
ISO-8859-1 : 0x3F 0x20 0x3F 0x20 0x3F 0x20 0x31   è 한글 코드인 0xD55C 0xB620 0xD3B2 모두 ? 변환된다. 모르는 코드들이니깐..
EUC-KR : 0xC7 0xD1 0x20 0x3F 0x20 0x3F 0x20 0x31    è KSC5601와 결과가 동일하다.
UTF-8 : 0xED 0x95 0x9C 0x20 0xEB 0x98 0xA0 0x20 0xED 0x8E 0xB2 0x20 0x31 è UTF-16에서 UTF-8변환된값..
ms949 : 0xC7 0xD1 0x20 0x8C 0x63 0x20 0xBC 0x84 0x20 0x31 è ,펲도 정상적으로 변환된다


한글<->8859변환

아래 코드는 유명한 한글과 8859_1간의 상호 변환 코드이다.

1      strTemp = 1”;

2      // Unicode 한글을 (ms949를 거쳐서)  8859-1로 변환..

3      strTemp = new String(strTemp.getBytes(“ms949"),"8859_1");

4       // 8859-1 String(ms949를 거쳐서) unicode로변환

5       strTemp = new String(strTemp.getBytes("8859_1")," ms949 ");  

예를 들어 외부 시스템과 I/O시에 해당 시스템이 ISO_8859_1 방식만을 지원한다면 한글 문자열은 변환과정을 거쳐서 저장하고 읽어와야 한다.

그 이유는 JAVA StringUTF-16을 지원하고, 외부 시스템은 ISO-8859-1만을 지원하므로 적절한 변환이 필요하다.

인터넷에 검색을 해보면 예제들은 99% “ms949” 대신 “ksc5601”를 사용하고 있다. 대부분 그 차이를 모르기 때문인 것 같다.

앞 페이지의 예제를 보듯이 KSC5601는 확장한글( ‘’,’8800여자)를 지원하지 못하기 때문에 ms949사용해야 한글 손실이 없다.

8859_1변환 ( 3번라인 )
     
strTemp = new String(strTemp.getBytes(“ms949"),"8859_1");

UTF-16 è ms949 è 8859-1 로 변환해야 한다.

ms949로 중간변환 없이 바로 strTemp.getBytes(8859_1”)로 한글을 바로 읽어오면.. 앞장에서와 같이 한글은 모두 ? 로 변경되어 버린다.

strTemp.getBytes(“ms949")를 수행하면.. 0xC7 0xD1 0x20 0x8C 0x63 0x20 0xBC 0x84 0x20 0x31 형태로 byte 배열형태로 읽어오고..

이를 8859_1로 변환해도..완전 동일한 0xC7 0xD1 0x20 0x8C 0x63 0x20 0xBC 0x84 0x20 0x31 값이 된다. ( 8859_10~0xFF까지 범위임)

최종적으로 strTemp에는 0x00C7 0x00D1 0x0020 0x008C 0x0063 0x0020 0x00BC 0x0084 0x0020 0x0031 형태 값이 된다.

ms949재변환  (5번 라인)
     
strTemp = new String(strTemp.getBytes("8859_1")," ms949 ");

8859-1 è ms949 è UTF-16 순서로 변환해야 한다.

외부 I/O를 통해서 받아온 데이터가 ISO-8859-1Encoding되어 String 변수에 0x00C7 0x00D1 0x0020 0x008C 0x0063 0x0020 0x00BC 0x0084 0x0020 0x0031 와 같은 형태로 저장되어 있을때..

이를 getBytes(“8859-1 “) 를 하면.. 0xC7 0xD1 0x20 0x8C 0x63 0x20 0xBC 0x84 0x20 0x31 값을 그대로 얻어오고..

“ms949” 파라미터에 의해.. 0xC7D1 0x20 0x8C63 0x20 0xBC84 0x20 0x31 같은 형태로 ms949 code값으로 묶어지고..
다시 해당 글씨들의 UNICODE값 치환된 UTF-16 형태인 0xD55C 0x0020 0xB620 0x0020 0xD3B2 0x0031 로 변환되어  strTemp로 최종적으로 저장된다.


인터넷에서 자료를 찾다보면 대부분 ms949 대신 euc-kr을 사용하고 있다. 하지만 java에서 ms949를 공식적으로 지원하고 있으므로 ms949를 사용하는게 바람직하다. 드믄경우지만 이름에 확장한글인 '믜'자을 사용하는 사람도 있으니..당연히 현대한글 11,172자를 표현가능한 ms949를 사용하는게 맞다.

'그외 주제들 > 한글처리' 카테고리의 다른 글

참고 자료..  (0) 2013.09.30
다양한 환경에서의 언어 설정  (0) 2013.09.30
Response 구간 정리  (0) 2013.09.30
Request 구간 정리  (0) 2013.09.30
JSP,Servlet에서 한글 문제를 피하려면..  (0) 2013.09.30
Posted by 행복한삶~!!
|