글쓴이 :김덕태 1998년 1월 10일 02:21:45
In Reply to: getBytes("KSC5601")은 일반적인 경우 잘 동작하는 것으로 보입니다. posted by 윤경구 on 1998년 1월 08일 17:05:03:
step 1. 자바 프로그램의 원시 화일은 일반적으로 디폴트 인코딩
(일반적인 한글 환경에서는 KSC5601)으로 인코딩되어 있으므로
JDK 1.1의 컴파일러는 원시화일내의 디폴트 인코딩의 모든 코드값을
유니코드에서의 대응하는 코드값으로 변환합니다.
step 2. 유니코드로 변환하여 컴파일한 후, 다시 UTF8 인코딩으로 변환하여
.class 화일로 저장합니다. 그리고, 실행시에는 UTF8을 다시
유니코드로 변환하여 메모리내로 적재되어 자바 프로그램이 실행됩니다.
따라서, 이 과정은 일반적으로는 알 필요가 없으므로,
원시화일내의 문자열을 유니코드로 변환한다고만 생각하면 됩니다.
step 3. 자바 1.1에서는 유니코드로부터 바이트배열로 코드 변환하여
출력하는 메쏘드 (하위 호환성을 위해 교정하지 않은 DataInputStream의 readLine() 메쏘드등은 제외)
는 대부분 디폴트 인코딩 (KSC5601)으로 코드변환하여
출력합니다.
즉, 보통 일반적으로 출력하는 데 사용되는 System.out.println("가각")에서의
println 메쏘드는 PrintStream 클래스에 속하는 메쏘드이며,
이 메쏘드는 인자로 주어진 (유니코드) 문자열 "가각" 을 디폴트 인코딩 (KSC5601)
로 변환하여 그 바이트들을 화면에 출력합니다.
step 4. 도스창에 뿌려젼 KSC5601 바이트가 한글 폰트를 찾아서 제대로
보여줄 지 않을 지는 자바 프로그램 및 자바 가상머쉰, 패키지가
제어할 수 없으며, 한글 환경의 도스창등은 그러한 바이트들을
만나면 무조건 KSC5601 바이트라고 생각하고 해당 한글 폰트를
이용하여 한글을 보여주게 됩니다.
이는 도스창등에서 한글을 출력할 때의 경우이고, 그래픽 자바 프로그램에서의
한글 출력은 해당 한글 폰트를 찾아서 출력하는 과정이 자바 가상 머쉰 및
패키지가 담당하여 출력하므로 이 부분은 자바가 어느정도 제어할 수 있으므로,
디폴트 인코딩으로의 변환과정이 필요없이 유니코드 문자열 그대로
해당 폰트를 찾아 문자를 출력해줍니다.
모든 유니코드 문자를 그래픽 자바 프로그램에서 출력할려면
상당히 많은 폰트를 설치하고, 폰트 프로퍼티 화일을 수정해야 하는 데,
이 부분이 제대로 표준화 및 문서화 되지 않았으며,
설정하기도 상당히 불편한 것이 자바 1.1의 문제점입니다.
즉, 자바 1.1은 유니코드 및 기타 다국어 기능 지원으로 인하여
하나의 자바 프로그램이 각 언어 환경에서 동작할 때 그 환경에만 맞게
동작하는프로그램을 짜는 것은 쉬운 일이나,
어떠한 언어 환경에서도 다양한 언어를 마음대로 입력하고 출력할 수 있는
진정한 다국어 자바 프로그램을 만들기에는 자바 1.1의 지원 기능이 상당히
부족하며 자바 1.2는 좀 나아진 것 같으나 역시 부족합니다.
getBytes 의 메쏘드 및 관련 문제점에 대해서는 좀 더 조사해보고 올릴 예정입니다.
초기버전에서 컴파일할때 오류가 났던 것도 코드 변환 문제였습니다.
코드 변환이 2가지가 있는 데, getBytes 처럼 유니코드로부터 외부 인코딩으로
변환하는 부류랑, new String 처럼 외부 인코딩으로부터 유니코드로 변환하는 부류입니다.
자바 프로그램의 원시화일을 컴파일할 때, 유니코드로 변환하여 컴파일한다고 하였는 데,
이때 사용되는 코드 변환 클래스가 sun.io.ByteToCharKSC5601 이라는 클래스였고
그 클래스의 버그로 인하여 컴파일이 제대로 되지 않았던 거 였는데,
이 버그는 곧 고쳐졌으며 현재로서는 2번째 부류의 코드 변환에는
버그가 없는 것으로 보여집니다.
현재의 문제가 되는 버그는 1번째 부류
(즉, sun.io.CharToByteKSC5601 클래스와 java.io.OutputStreamWriter 클래스 및 관련클래스)
의 버그입니다.
그래픽 프로그램에서도 약간의 버그가 있지만
별로 심각한 것은 아니며, 자바 1.1의 표준에 맞추어 프로그래밍하면
한글이 제대로 보이지 않는 경우는 거의 없을 것입니다.
정석에 맞추지 않으면, 한글이 보이기도 하고, 안보이기도 하고, 일부만 보이기도 하고 등등
대단히 헷갈리게 될 것입니다.
좀 명확해지셨는지요?