Java CharacterSet Endcoding (유니코드 및 UTF-8 설명 포함)

By | 1월 31, 2011

- 출처 : http://kalpa730.blog.me/140118582507 -

1. new String(text.getBytes(fromEncode), ToEncode) 구문은 잊어주세요. 이 방식은 초창기 시절 tomcat 같은데서 HTTP로 받은 파라메터의 인코딩이 무조건 ISO-8859로 강제 인코딩 되서 들어오는 문제가있었는데, 그걸 잡으려고 다시 강제로 깨진 문자열을 한글로 바꾸는 거였습니다만.  일단 제대로 Java 상에서 인코딩 된 경우.( 위 예제에서는 TEXT="한글" 이라고 제대로 들어가 있음) 전혀 사용해서는 안되는 구문입니다.

 

2. Java에서 사용하는 것은 "유니코드" 이거 하나 밖에 없습니다. String은 까서 보면 char[] 이고, char하나 하나는 결국 유니코드 문자입니다.

즉 Java에서 쓰는 모든 캐릭터는 "유니코드"라는점을 기억해 두셔야 합니다. 그러면 "UTF-8"은 "Unicode Transform Format" 즉 유니코드를 다른 곳으로 전송하기 위한 포맷입니다. (즉 "UTF-8"은 유니코드가 아닙니다. 혼동하시면 안됩니다. 자바에서 쓰는 Char는 "USC-2"포맷을 약간 변경한 것으로 유니코드를 16-bit로 표현한 것입니다.")

 

3. 그럼 "UTF-8", "EUC-KR"등은 어디서 쓰는 것이냐 하면, 자바의 char(USC-2)를 네트워크로 전송하거나 파일로 기록할 때 사용하는 일종의 변환 포맷이라고 보시면 됩니다. 즉 이런 File I/O 나 Network I/O를 하기 전에는 구지 제대로 되어 있는 String을 String.getBytes() 등으로 byte 변환 하실 필요 없습니다. 질문하신 분의 경우에는 서버쪽에서 "EUC-KR"으로 송수신 하기를 원하기 때문에 서버로 줄 때

 

byte[] eucBytes = text.getBytes("EUC-KR");

 

이렇게 해서 euc-kr로 생성된 바이트를 네트워크로 전송하고, 반대로 받을 때는 String text = new String(eucBytes, "EUC-KR");

 

이렇게 네트워크를 통해서 euc-kr로 받은 바이트들을 Java의 스트링으로 만들면 됩니다.

 

4. 이론은 이렇습니다만, 실제로 이렇게 하면 생기는 문제가 전송할 때는 그냥 보내면 되는데, 받을 때는 EUC-KR의 문자열 끝이 어딘지 확인해서 적당히 끊어줘야 제가 위에 적은 방식으로 String으로 변환 할 수 있는데 여간 귀찮은 일이 아닙니다. 그래서 java.io 에 보시면 Reader와 Writer라는게 있습니다.

 

네트워크로 이 작업을 한다고 생각해 보시면 네트워크 소켓을 통해서 바이트로 데이타를 주고 받는 InputStream과 OutputStream을 얻을 수 있을 겁니다.

그러면 OutputStreamWriter writer = new OutputStreamWriter( new InputStreamReader(sock.getInputStream(), "EUC-KR")));

String text = reader.readLine();

 

이렇게 하면 네트워크를 통해서 받은 EUC-KR을 Java의 Strin
g 형으로 변환해 줍니다.

 

!!! 결론

1. new String(text.getBytes(fromEncode), ToEncode)  이건 뻘짓이다.. 하지말자 -_-

2. Java에서 다른 인코딩셋으로 변경하는 경우는 Stream을 통해서 외부로 보내거나 받을 때 뿐이다.

 
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments