자바 한글 FAQ

이 FAQ 문서의 내용은 주로 자바 묻고 답하기 게시판의 게시물에 기반하고 있으므로
각 게시물에 대한 저작권은 각 게시자에 있습니다.
게시물 내용의 정확성에 대해 관리자가 확인을 하지는 않습니다.
게시판에 적극 참여해주시는 모든 분들께 다시 한번 감사드립니다.

1998/05/18 첫 웹 출판, 2004/8/31 최종 갱신

차 례
  1. 폰트
    • 자바에서 한글을 사용할 수 있는 폰트
  2. JDK
    • JDK 1.1, 1.2에서 한글 메시지 출력
  3. AWT
    • JDK 1.0 버전의 TextField, TextArea에서 한글 입력기 구현
  4. JFC(스윙)
    • 스윙 컴포넌트(JTextArea, JTextField)에서 한글 입출력
  5. JNI(자바 네이티브 인터페이스)
    • JNI 사용 때의 한글 처리
  6. 서블릿
    • 서블릿에서 한글 처리 문제
    • 폼의 한글을 서블릿에서 받기
    • 유니코드로 된 파일 이름을 다운로드하기
  7. JDBC(자바 데이터베이스 접속)
    • JDBC에서의 한글 문제
    • 오러클 JDBC 한글 문제
    • mSQL-JDBC(mSQL은 miniSQL을 뜻합니다.)
    • MySQL JDBC 한글문제
  8. 운영체제
    • 리눅스에서 한글 입출력
    • AIX에서 한글 입출력
  9. 자바 플러그인
    • 자바 플러그인의 한글 문제
  10. 문자셋, 인코딩, 로캘
    • 유니코드와 인코딩
    • KSC5601에 없는 한글 문자 처리
    • 문자 범위 검사
    • 시간 표시
    • 한글 자모음 분해
  11. URL 인코딩/디코딩
    • URL 디코딩하기
    • URL encode에 대해
  12. 웹 브라우저
    • 유니코드 출력
    • 넷스케이프와 한글
    • 익스플로러와 한글
  13. X/Motif(유닉스 GUI 환경)
    • JDK 1.2에서 이미지 파일이나 스윙 등이 보이지 않는 문제
    • 유닉스에서 한글 디스플레이하기
    • 원격지 X 서버에서 실행한 솔라리스 자바 프로그램의 한글 글꼴 설정
  14. 국내 자바&한글 사이트


폰트
1. 자바에서 한글을 사용할 수 있는 폰트
게시물 참조 :
표준 (다국어) 폰트 이름[김덕태]

JDK
1. JDK 1.1, 1.2에서 한글 메시지 출력
게시물 참조 :
JDK1.1, JDK 1.2 한글 보완판 (비공식)[김덕태]

AWT
1. JDK 1.0 버전의 TextField, TextArea에서 한글 입력기 구현
사이트 참조 :
한글 윈도우 95에서 한글 입력기 구현[임국주],

JFC(스윙)
1. 스윙 컴포넌트(JTextArea, JTextField)에서 한글 입출력
스윙 1.0.2 버전+JDK 1.1.6 버전에서는 한글 입출력이 모두 가능합니다. (윈도우 95/NT에서 테스트)
스윙 1.0.2 버전+JDK 1.1.5 버전에서는 한글 출력만 가능하다고 합니다.
이전 버전에서는 한글 입력이 안되고 출력에도 일부 문제가 있었습니다.
이전 버전에서 한글 입출력하려면 다음 게시물을 참조하세요 :
JTextField, JTextArea에서 한글 입력방법[김덕태]

JNI(자바 네이티브 인터페이스)
1. JNI 사용 때의 한글 처리
사이트 참조:
네이티브 인터페이스 프로그래밍에서의 다국어(한글) 처리[김덕태]

서블릿
1. 서블릿에서 한글 처리 문제
소스 참조 : 브라우저에 따라, 또 tomcat, apache-tomcat 연동 등 서블릿 컨테이너 환경에 따라 UTF8, native encoding 등으로 섞여서 넘어오는 url parameter를 제대로 해석하는
예제 서블릿 코드[윤경구]
게시물 참조 : 서블릿의 한글 코드 처리 과정[김덕태], JSDK 1.1 호환 환경에서의 서블릿 한글 처리 방법[김덕태]

2. 폼의 한글을 서블릿에서 받기
사이트 참조 : HURLDecoder 소스와 그림으로 설명한 사용법[강신동]

3. 유니코드로 된 파일 이름을 다운로드하기
사이트 참조 : Problem in downloading a pdf file having Japanese characters in the name of the file
요약하자면 다음과 같이 URL encoding과 QP 인코딩과 거의 유사한 (RFC2047 참조.정확하게 일치하지는 않는다) 인코딩을 중첩 사용하여 유니코드 파일 이름을 Content-Disposition을 통하여 download하도록 지정할 수 있다. 아마, 인터넷 익스플로러 5.5 이상에서 동작할 것이다. 이렇게 할 경우에 어느 정도 이상의 긴 파일 이름에 대해서는 인터넷 익스플로러이 인식하는 헤더 길이 제한에 의해 제대로 동작하지 않는다.

		response.setContentType("application/octet-stream;");
		String header = "=?UTF-8?Q?attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8") + ";?=";
		response.setHeader("Content-Disposition", header);

JDBC
1. JDBC에서의 한글 문제
게시물 참조 :
데이타베이스에서의 한글 처리방법[김덕태], 데이터베이스 한글 문제 해결책의 버그 교정[김덕태], JDBC 통합 한글 해결책[김덕태]
사이트 참조: JDBC에서의 한글 및 다국어 처리[김덕태]

2. 오러클 JDBC 한글 문제
게시물 참조 : 오라클 OCI 드라이버, Thin 드라이버 7.3.4의 유니코드 1.2 한글 문제 및 해결책[김덕태], JDBC에서 한글처리 문제(오라클)[오영석], 오라클 JDBC에서의 한글문제 극복을 위하여[나경권]
사이트 참조 : 자바(오라클) JDBC에서 한글처리에 대한 정리[나경권]

3. mSQL-JDBC(mSQL은 miniSQL을 뜻합니다.)
게시물 참조 : mSQL-JDBC의 JDK 1.1 지원 한글 Select, Update 예제[윤경구]

4. MySQL JDBC driver 한글 문제
MM.MySQL JDBC 드라이버를 사용할 때 한글을 입출력하려면 MySQL 자체는 유니코드를 지원하지 않고 ISO8859-1 문자셋만 지원하므로 JDBC 드라이버에서 변환을 하거나 String을 항상 8859_1 문자열로 변환해서 insert나 update를 해야 합니다.
다음 url에서는 MM.MySQL에서 사용할 수 있는 connection url 변수를 볼 수 있습니다.
Documentation for MM.MySQL

Table. URL Parameters

Name Use Default Value
user The user to connect as none
password The password to use when connecting none
autoReconnect should the driver attempt to re-connect if the connection dies? (true/false) false
maxReconnects if autoReconnect is enabled, how many times should the driver attemt to reconnect? 3
initialTimeout if autoReconnect is enabled, the initial time to wait between re-connects (seconds) 2
maxRows The maximum number of rows to return (0 means return all rows) 0
useUnicode should the driver use Unicode character encodings when handling strings? (true/false) false
characterEncoding if useUnicode is true, what character encoding should the driver use when dealing with strings? none
즉, url을 줄 때 jdbc:mysql://host/dbname?useUnicode=true&characterEncoding=EUC-KR 와 같은 방식으로 주게 되면 String을 입력하기 위해 별도의 문자열 변환을 코드에서 하지 않아도 됩니다.
물론 이 방법을 사용하지 않을 경우 직접 ISO8859-1 문자셋으로 인코딩을 변환하면 됩니다. (이 방법은 매번 문자열을 입력할 필요가 있을 때마다 이 메소드를 호출해야 하므로 코드가 지저분해지며 번거롭습니다.)
	String convert8859_1(String data) {
 		try {
 			data = new String(data.getBytes("EUC_KR"), "8859_1");
 		} catch (UnsupportedEncodingException e) {
 			System.err.println("unsupported encoding error");
 		}
 		return data;
	}

운영체제
1. 리눅스에서 한글 입출력
게시물 참조 :
Linux JDBC에서 한글 입출력 성공[전덕찬], 유닉스에서 현대 한글 11,172자 출력 방법 및 옛 한글 출력 방법, 기타 문제점[김덕태]

2. AIX에서 한글 입출력
게시물 참조 : AIX 4.2의 JDK 1.1.4에서 한글 문제 원인 및 해결책[김덕태]

자바 플러그인
1. 자바 플러그인의 한글 문제
게시물 참조 :
자바 플러그인 1.1의 한글 관련 문제점과 해결책[김덕태]

문자셋, 인코딩, 로캘
1. 유니코드와 인코딩
게시물 참조 :
유니코드와 UTF-8, 그리고 자바...[김덕태], 유니코드, 문자 세트, 인코딩의 개념, 자바의 인코딩 개념.[김덕태], 자바 프로그램의 문자 코드 변환 과정[김덕태], JDK 1.1, 1.2의 한글 관련 인코딩[김덕태]

2. KSC5601에 없는 한글 문자 처리
사이트 참조 : Java에서 KSC5601의 문제와 해결책[김필호]

3. 문자 범위 검사
게시물 참조 : 어떤 문자가 한글인지 영문인지 판별하기[윤경구]

4. 시간 표시
게시물 참조 : 한국 로캘로 시간 표시하기[윤경구]

5. 한글 자모음 분해
게시물 참조 : 한글 스트링을 분해하는 방법[박민규]

URL 인코딩/디코딩
1. URL 디코딩하기
소스 참조 : 브라우저에 따라, 또 tomcat, apache-tomcat 연동 등 서블릿 컨테이너 환경에 따라 UTF8, native encoding 등으로 섞여서 넘어오는 url parameter를 제대로 해석하는
예제 서블릿 코드[윤경구]
게시물 참조 : encode된 url을 decode하기[박진우]
2. URL encode에 대해
게시물 참조 : url encode에 대해 [박진우]

웹 브라우저
1. 유니코드 출력
게시물 참조 :
익스플로러 및 넷스케이프에서의 유니코드, UTF8 출력 가능...[김덕태]

2. 넷스케이프와 한글
게시물 참조 : 넷스케이프 4.x와 JDK 1.1 패치 시 한글 문제[김덕태], 넷스케이프4의 JDK1.1 패치 여부에 무관한 한글 사용 방법[김필호]

3. 익스플로러와 한글
게시물 참조 : 익스플로러의 <APPLET> 태그 버그[윤경구]

X/Motif(유닉스 GUI 환경)
1. JDK 1.2에서 이미지 파일이나 스윙 등이 보이지 않는 문제
JDK 1.2의 구현 상의 버그로 인해 JDK 1.2,JDK 1.2.1-1 등의 버전에서는 원격지의 X 서버(X 터미널이나 Exceed, Xwin32 등의 PC용 X서버)에서 GUI 환경의 자바 프로그램을 실행시키면 이미지나 스윙 셋을 불러오지 못하거나 아주 느리게 불러오는 문제점이 있습니다.
JDK 1.2.1-2 버전부터는 이 버그가 수정되었으므로 이후 버전을 사용하시기 바랍니다.

2. 유닉스에서 한글 디스플레이하기
자바 GUI 프로그램을 유닉스 환경에서 실행할 때 한글이 제대로 디스플레이되지 않으면 다음 몇 가지 환경을 검사해야 합니다.

(1) 먼저 로캘 환경변수가 맞는지 확인해봐야 합니다.
유닉스 환경에서 각 국가와 언어를 표현하는 로캘 환경변수는 보통 LANG과 LC_ALL인데 대한민국-한글을 나타내는 값은 운영체제에 따라 조금씩 다릅니다.
예를 들어 솔라리스는 LANG=ko, LC_ALL=korean으로 설정하며, 리눅스, 디지털 유닉스 등은 LANG=ko, LC_ALL=ko_KR로 설정합니다.
셸에서 locale -a 명령을 사용하면 해당 시스템에서 사용 가능한 모든 로캘 값들을 볼 수 있습니다.

(2) font.properties.ko가 제대로 설정되었는지 확인합니다.
일단 로캘이 제대로 설정되면 자바 GUI 프로그램은 font.properties가 아닌 font.properties.ko 파일에서 글꼴 설정을 읽어들입니다. (JDK 1.2에서는 font.properties.ko 파일은 $JAVA_HOME/jre/lib 디렉토리에 있습니다.)
지정된 글꼴들이 해당 X서버에 설치되어 있어야 글꼴 에러가 발생하지 않습니다.
글꼴 에러가 발생할 경우 X서버에 해당 글꼴을 구해서 설치하는 방법과 이미 설치되어 있는 글꼴을 사용하도록 font.properties.ko 파일을 변경하는 두 가지 방법을 사용할 수 있습니다.
솔라리스 2.6의 경우 운영 체제 패치를 설치하지 않으면 한글 글꼴을 제대로 디스플레이하지 못하는 버그가 있습니다. JDK 최신 버전을 다운로드하여 사이트의 INSTALL 방법을 잘 읽어보고 OS 패치를 설치하시기 바랍니다.
TTF 파일이 있으면 자바 VM에 직접 추가해서 사용할 수도 있습니다.
$JAVA_HOME/jre/lib/fonts 디렉토리에 추가할 ttf 파일을 넣은 후 같은 디렉토리의 fonts.dir 파일을 편집해서 등록해주는 방법을 사용하면 됩니다.
예를 들어 파일 이름이 symbol.ttf이라면 다음과 같이 적당히 요구하는 포맷에 맞추어주면 됩니다. 가변폭 글꼴이므로 반드시 타입을 p로 적어야 하고 나머지 글꼴 크기 등에 관련된 정보는 0으로 지정해준다는 점과 마지막의 글꼴의 인코딩 정보를 제대로 적어줘야 하는 점을 제외하면 쉽게 할 수 있을 것입니다.
symbol.ttf -urw-symbol-medium-r-normal--0-0-0-0-p-0-adobe-fontspecific
한글 글꼴인 경우라면 다음 방법으로 fonts.dir 파일을 고치고 물론 font.properties.ko에서도 이 글꼴을 쓰도록 수정해주면 될 것 같군요.
gulim.ttf -hanyang-gulim-medium-r-normal-0-0-0-0-0-p-0-ksc5601.1987-0

(3) 인코딩을 제대로 지정해서 컴파일되었는지 확인합니다.
한글 윈도우에서는 운영 체제의 font association 때문에 인코딩이 잘못된 String 값들도 한글로 디스플레이될 수 있습니다.
유닉스 시스템의 GUI 환경에서만 한글이 1바이트로 된 깨진 글자들로 디스플레이된다면 컴파일할 때 -encoding EUC_KR 옵션을 줘서 다시 컴파일해보시기 바랍니다.

3. 원격지 X 서버에서 실행한 솔라리스 자바 프로그램의 한글 글꼴 설정
솔라리스 2.6에서 JDK 1.2.1-3으로 테스트한 결과 로컬 그래픽 콘솔이 아닌 원격지 X 서버에서는 font.properties.ko 파일의 글꼴들을 자바가 디스플레이하지 못합니다.
이 원인은 솔라리스 native로 구현된 자바의 경우 가변 크기(scalable) 글꼴만을 읽어와서 디스플레이하기 때문입니다.(버그 리포트되어 있습니다.
http://developer.java.sun.com/developer/bugParade/bugs/4254107.html)
다른 유닉스 시스템(예를 들어 Digital Unix의 JDK 1.2.1-2의 경우)에서는 일반 pcf 글꼴을 제대로 디스플레이하므로 솔라리스의 레퍼런스 구현 버전에서는 이런 문제가 없을 것 같습니다.
문제는 scalable 한글 글꼴이 CID, F3, TTF 등의 포맷을 가지고 있어 솔라리스 2.6에 설치된 X 폰트 서버(xfs)가 이들 글꼴 형식을 지원하지 않는다는 데 있습니다.
(솔라리스 7에서는 테스트해보지 못했습니다. 테스트해보신 분 알려주시면 고맙겠습니다. 솔라리스 2.6의 경우 xfs의 환경 설정 파일은 /usr/openwin/lib/X11/fontserver.cfg입니다. 로컬 그래픽 콘솔에서 xset -q를 실행하여 font path를 구한 다음 이 path를 fontserver.cfg의 catalogue에 적용하여 테스트해보면 될 것 같습니다.)
해결책은 한글 scalable 글꼴을 원격지에서 사용할 수 있게 하는 것입니다. 두 가지 방법을 사용해봤습니다.
(ㄱ) 트루타입 폰트 서버를 사용하는 방법입니다. 한글 트루타입 글꼴을 사용할 수 있는 XTT를 구해서 설치한 후 X 서버의 font path에 등록하는 것입니다.
물론 font.properties.ko 파일을 이에 맞게 수정해야 합니다.
(ㄴ) Exceed와 같은 PC용 X서버들은 윈도우의 트루타입 글꼴을 사용하는 기능이 있습니다. 이것을 사용할 수 있습니다.
Exceed의 경우에는 Create Pseudo Font라는 메뉴가 있어서 트루타입 글꼴을 등록할 수 있습니다. 물론 자동으로 scalable 글꼴로 등록됩니다.
이것을 Make Alias 하여 실제 font.properties.ko에 지정된 글꼴로 바꿔주면 됩니다. Alias를 줄 때 주의할 점은 scalable 글꼴이므로 각 사이즈 및 폭 등을 0으로 지정해야 한다는 점입니다.
예를 들어 기본 font.properties.ko에 지정된 한글 글꼴은 다음 두 가지입니다.
-hanyang-cid myeongjo-medium-r-normal-*-*-%d-*-*-m-*-ksc5601.1987-0
-hanyang-cid roundgothic-medium-r-normal-*-*-%d-*-*-m-*-ksc5601.1987-0
cid myeongjo로 alias를 주려면 다음과 같이 지정합니다. *와 %d를 모두 0으로 바꾼다고 생각하면 됩니다.
-hanyang-cid myeongjo-medium-r-normal-0-0-0-0-0-m-0-ksc5601.1987-0
마찬가지로 cid roundgothic도 이렇게 지정하면 됩니다. 윈도우의 바탕과 굴림을 각각 cid myeongjo와 cid roundgothic로 매핑하니까 잘 되더군요.
실제로는 바탕과 굴림이 ksc5601.1987-1 인코딩으로 등록되는데 ksc5601.1987-0 인코딩 글꼴로 alias를 잡아도 잘 되더군요. 저는 인코딩에 문외한이라서 쩝... 어쨌든 결론은 되더군요.

국내 자바&한글 사이트


[자바 묻고 답하기 게시판]으로...
Yoon Kyung Koo <yoonforh at yahoo dot com>
Last modified: Sat Dec 11 23:28:39 +0900 2004