글쓴이 :김덕태 1998년 1월 10일 01:38:20
In Reply to: [재질문] getBytes("KSC5601") 에 관하여... posted by 김필호 on 1998년 1월 08일 13:30:51:
JDK 1.1 나올 무렵 (베타였던가?), 한글 관련 버그가 좀 많았습니다.
프로그램에 한글을 인자로 넘겨주면 깨지는 문제가 발생하는 것을
윤경구님이 뉴스 그룹을 통하여 올리셨는 데,
출력되는 코드값을 보니, 여태까지 계속 문제가 되는 것과 마찬가지
현상이었습니다. 즉, 한글을 유니코드에서의 한글 코드 영역으로
변환하지 않고, 8859-1 문자 영역으로 변환하는 것이었습니다.
그 버그는 JDK 내부의 코드 변환 버그였고, 그래서, 유니코드로
코드변환하기 이전상태의 바이트 배열을 구해서 코드 변환 버그
이전 상태의 바이트들을 구한다음 다시 유니코드의 한글 영역으로
제대로 변환함으로써 JDK 내부의 버그를 해결하는 방법을 제공했던 것입니다.
그러나, 지금은 그 버그가 고쳐져서 제대로 코드 변환을 합니다.
제대로 코드 변환된 스트링을 다시 그와 같이 변환하면
이번에 한글이 다시 깨지게 됩니다.
즉, 그러식의 해결방안은 대부분 미봉책에 불과한 것입니다.
그래서, 저는 그런 방법을 쓰는 것을 아주 싫어하지만
버그라던가 자바의 설계상 문제등이 있을 때는 어쩔 수 없이
쓸 수 밖에 없기도 합니다.
다른 방법이 있는 데도 쓰는 것은 결코 바람직하지 않습니다.
질문 1에 대한 답변.
http://calab.kaist.ac.kr/~dtkim/java 에 보시면,
다음 부분이 있습니다.
sun.io.CharToByteKSC5601 클래스의 버그
EUC-KR (KSC5601) 인코딩으로 출력할 때, 일부 문자 자료가 출력되지 않고 사라진다. 이
클래스는 유니코드를 KSC5601 인코딩의 바이트로 변환하는 모든 클래스에서 내부적으로
사용된다.
getBytes도 이 클래스를 사용하여 KSC5601 코드로 변환하므로, 이 클래스의 버그는
getBytes 뿐만 아니라 이를 내부적으로 사용하는 다른 클래스의 버그로 이어집니다.
버그의 원인은 예외 처리를 잘못한 좀 미묘한 것이었습니다.
이 클래스의 버그가 영향을 미치는 클래스가 많아서 workaround를 만들기 곤란하고 복잡했으므로,
이들 클래스를 교정하여 배포했던 것입니다.
그러나, 웹 브라우저에서는 일반 사용자가 그 버그 패치화일을 설치하기가
곤란할 것이고, 생각과는 달리 썬사에서는 아직도 그 버그를 고치지 않고 있어서,
좀더 자세한 bug checking program과 workaround를 준비중입니다.
이 클래스의 버그가 getBytes의 버그로 이어지지는 않는 것 같더군요.
좀 더 조사해보아야 합니다.
질문 2에 대한 답변.
질문 의도를 잘 파악할 수 없음.
질문 3에 대한 답변.
댓글에 보니 이해하신 것 같군요.
질문 4에 대한 답변.
자바 원시화일을 한글 환경의 편집기로 보면,
String str = "가각" 에서의 `가' 라는 문자와 `각'이라는 문자가
한글로 제대로 보입니다.
그 이유는 자바의 원시화일내에 있는 한글은 현재 표준화 되어있는
KSC5601 인코딩의 바이트 값으로 저장되어 있기 때문입니다.
(즉, '가'도 KSC5601 2 바이트, '각'도 KSC5601 2 바이트 차지)
자바 1.1에서는 문자가 모두 유니코드 2.0으로 표현되어야 하므로,
이러한 문제를 해결하기 위해 JDK 1.1의 자바 컴파일러는 원시화일내의
KSC5601 바이트들을 모두 유니코드의 한글 영역에 있는 코드값으로
변환하여 .class 화일을 만들게 됩니다.
즉, 제대로 컴파일된 .class 화일에는 한글이 유니코드 영역 0xAC00 부터 시작하는
한글 코드값으로 저장되므로, 실행시켜보면 유니코드 값으로 저장되어 있음을
알 수 있습니다.
따라서, 유니코드 한글 문자열이 저장된 str변수를 getBytes("KSC5601")을
실행하면 바이트 배열이 반환되는 데, 이때 유니코드내의 한글 코드 영역에 있는 코드값은
KSC5601내에서의 대응하는 한글 문자를 나타내는 코드값으로 변환되어 반환됩니다.
따라서, 그 바이트 배열을 화일로 저장하거나 도스창으로 그대로 출력하면
일반적인 한글 환경에서 한글을 볼 수 있는 형태인 KSC5601 코드값으로
저장되게 되는 것입니다.
결론적으로, EUC-KR (KSC5601) 코드값이 그대로 char, char[], String 자료형에 저장되면
그건 일단 잘못 저장된 것입니다. 코드 변환을 해서 유니코드의 한글 영역내의
코드값으로 저장해야 합니다.
그래픽 프로그램에서의 한글 출력방식은 이와 좀 다릅니다.
지금 여러가지 예제 프로그램 및 테스트, 자료등을 준비하고 있습니다.