Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

pungjoo

작성중 - 깨지는 한글.. 본문

JAVA

작성중 - 깨지는 한글..

pungjoo.kim 2012. 1. 27. 15:20
0. 들어 가면서

꽤나 오래전부터 한글 깨짐에 대한 질문을 1년에 서너 차례 받곤 합니다.  한글이 깨져 보이는데 영향을 주는 요인으로는 'font'와 언어적인 'encoding type' 또는 'protocol'에 대한 이해 부족에서 비롯합니다. 

web page의 경우
x. code에 기술된 한글은 깨지지 않는 것 같으나 database에서 얻은 값은 깨지는 것 같다.
x. code에 기술된 한글과 database에서 얻어 값은 잘 보이나 사용자가 입력한 값은 깨지는 것 같다.
x. code에 기술된 한글은 깨지고 datatbase에 얻은 값은 깨지지 않는다
x. 등등...

1. 준비운동
우리는 한국 사람이고 한국어를 모국어 사용합니다. 해서 주변에 있는 분들과 대화를 할때 '자 이제 부터 내가 하는 말은 한국어야.. 영어 아니다..'라고 시작하지 않습니다. 그냥 자연스럽게 말을 합니다. 그런데 요즘은 국제화 사회다 어떻다 합니다. 해서 외국인들과 대화하게 되면 의례 우리네들은 그네들의 언어에 부합되게 말을 합니다. '자 이제 부터 영어로 말할께..'라고 말하지 않고 말입니다. 그런데 재미있는 것은 영어권 사람이 한국에 와서 모르는 한국 사람 잡고 말 합니다. ' Can you speak English?'. 하긴 그네들 말로 하긴 하네요. 그래도 물어 봐 주네요. '내가 앞으로 영어로 말할건데 너 영어 할수 있냐?'라는 생각으로다...

우리네들이 만들어 가는 code라는 것은 문자열에 불과 합니다. 이는 정확히 말하면 byte의 나열에 불과합니다. (bit 제외) 한국 사람에게는 한글이 의미 있고 영어권 사람에게는 영어가 의미가 있듯이 이 byte의 나열은 의미를 부여 받을 수 있는 곳에서 비롯서 byte의 나열이 문자열이 되고 그 문자열이 code가 됩니다. data와 information의 차이처럼..

정리하면
우리는 다양한 언어권에 살지 않기 때문에 의례적으로 한가지 언어로 규정해 버립니다. 영어권자를 보면 우리네들은 의례 '왜 그런지 모르겠지만 / 내 나라에서' 그네들의 언어로 말해 주려 합니다. 우리네들은 영어권 나라를 여행하면서 '왜 그런지 모르겠지만/ 그네 나라에서' 그네들의 언어로 말해 주려 합니다.

이 같이 컴퓨터라는 언어에서도 적극적으로 상대방을 배려하면서 그가 알아 듣게 말해 줘야 합니다.


2. java 넌 그래서 무슨 언어냐..(encoding)
간단한 실험을 해 봅시다.


o/s의 lang는 utf-8이고 source도 utf-8로 작성되었고 o/s lang의 utf-8에서 컴파일했고 o/s lang utf-8에서 실행을 했습니다. 

그냥 컴파일 하고 실행했다고 하면 될 것을 '무슨 encoding type으로 작성되었고 무슨 encoding에서 컴파일했고 무슨 encoding에서 실행했다'고  복잡하게 기술했습니다.

자.. 그럼 o/s lang가 utf-8인 부분을  euc-kr(ko_KR)로 변경해  실행해 보겠습니다.



'나는 한글이다' 부분이 깨졌네요.

왜 깨졌을 까요? 정말 깨졌을까요?


단지 console의 '문자 인코딩 설정'을 변경하니 정상적으로 보입니다. 더 복잡합니다. 이건 또 뭘까요?..

이 질문에 대한 근본적인 답은 후에...


3. jvm에서 벗어난 data를 읽기
jvm을 벗어난 file의 내용일 읽어 console에 표기 하는 내용입니다.


console의 문자인코딩은 'utf-8'입니다.
그럼 위 내용중에 utf-8로 작성된 '문자열'이 아닌 euc-kr로 작성된 '문자열'로 확인해 보겠습니다


위와 같이 console의 '문자 인코딩 설정'의 차이로 깨질 수 있으니 console 인코딩 까지 euc-kr로 해 보겠습니다.


그러나 더 알수 없는 형태로 보입니다.  (cat 부분은 정상으로 보이네요.)

그럼 DataReader1.java의 부분을 다음과 같이 수정하고 다시 해 봅시다.

// InputStreamReader isr = new InputStreamReader( fis );
InputStreamReader isr = new InputStreamReader( fis , args[1]);


참고로 console의 '문자  인코딩 설정'은 utf-8입니다.  parameter로 'euc-kr'을 넣으니 정상으로 나옵니다.

왜 그럴까요?

우선 euc-kr.txt를 hexdump로 해서 byte로 표현해 보면 아래와 같습니다.


그럼 java로 euc-kr.txt를  byte 단위로 읽어 hexdump 처럼 출력해 보면 


byte 단위로 보면 깨진 부분이 없지만 new String 해서 문자열화해서 찍어 보니 한글이 깨집니다.
그럼 다음과 같이 해 보겠습니다.
//System.out.println( new String( baos.toByteArray() ) );
System.out.println( new String( baos.toByteArray() , args[1] ) ); 


참고로 utf-8도 해 봅시다.



어쩌구 저쩌구 해서 쩌구 하다..

 

Comments