오라클 OCI 드라이버, Thin 드라이버 7.3.4의 유니코드 1.2 한글 문제 및 해결책


[ 다음 글들 ] [ 이어서 글올리기(답하기) ] [ 자바 묻고 답하기 ]

글쓴이 :김덕태 1998년 2월 07일 08:27:48

In Reply to: 오라클 JDBC드라이버에서의 한글처리에 대한 정리(2) posted by 나경권 on 1998년 2월 06일 20:45:54:

이들 드라이버는 유니코드 1.2만을 지원하며 자바에서의 유니코드 2.0의 한글
표현 차이로 인해 문제가 생기는 것이며, 오라클 드라이버의 코드 변환 과정은
다소 복잡한 것으로 보입니다.


한글환경에서 데이타베이스의 인코딩을 8859-1로 설정하는 것은 바람직하지 않으며,
만약 이와 같이 하고자 한다면, 오라클사나 전문가에게 발생할 수 있는 문제점을
먼저 문의하여 확인받으시기 바랍니다.


어쨌든, 데이타베이스 인코딩으로는 KSC5601 및 UTF8만을 고려하는 것이 바람직하며
자바와 드라이버가 문자열을 교환할 때, 다음 클래스의 메쏘드를 사용하여 유니코드 1.2와
변환하여 주고 받도록 하십시오.


직접 사용해보지는 못했으나, KSC5601의 경우에는 문제없이 동작한다고 들었으며,
또한, 데이타베이스의 인코딩과 NLS_LANG을 둘다 UTF8로 설정한 후에,
자바 프로그램을 수정없이 그대로 수행해도 될 것으로 보입니다.
물론, 어떤 경우든 유닉스에서는 setenv LANG ko도 반드시 실행한 후,
검사해보시기 바랍니다.


SQL*PLUS로 안되는 이유는 사용하신 터미날이 KSC5601만을 지원하기 때문이며,
UTF8을 지원하는 터미날상에서 테스트해보시기 바랍니다.
(UTF8 지원 hanterm: ftp://ftp.kaist.ac.kr/hangul/terminal/hanterm/hanterm304beta )


자바의 경우는 굳이 UTF8 지원 터미날이 필요하지 않습니다.
(Sysytem.out.println이 KSC5601로 다시 변환해주니깐)



/*
* @(#)DB.java 1.0 98/02/05
*
* Program Type: Package
*
* Purposes:
* 3. 유니코드 2.0과 유니코드 1.1, 1.2와의 한글 표현 차이를 보완한다.
*
* Usage:
*
*
* Background Information for Unicode 2.0 and Unicode 1.0, 1.1, 1.2 Hangul Representations:
*
* - 유니코드 2.0 한글 영역: 0xac00 ~ 0xd7a3 (11172자)
* - 유니코드 1.1의 KSC5601 대응 한글 영역: 0x3400 ~ 0x3d2d (2350자) (Unicode 1.0)
* - 유니코드 1.1의 한글 보충 영역 A, B: 0x3d2e ~ 0x4dff (4306자) (Unicode 1.1, 1.2)
* (참고: DB.java는 이 영역을 지원하지 않는다.)
* - KSC5601 한글 영역: 0xb0a1 ~ 0xc8fe (2350자)
*
* Author: Deogtae Kim , 98/02/05
*
*/


import java.sql.*;


class DB
{
// For verfication of this package.
public static void main( String[] args )
{
// For conversion between Unicode 2.0 and 1.2
if ( ! toUni12( "\uac00" ).equals( "\u3400" ) ||
! toUni12( "\ud79d" ).equals( "\u3d2d" ) ||
! fromUni12( "\u3400" ).equals( "\uac00" ) ||
! fromUni12( "\u3d2d" ).equals( "\ud79d" ) )
{
System.out.println( "Conversions between Unicode 1.2 and 2.0 failed." );
return;
}
System.out.println( "Conversions between Unicode 1.2 and 2.0 are O.K." );
}



// Unicode 2.0 -> Unicode 1.2
public static String toUni12( String uni20 )
{
int len = uni20.length();
char[] out = new char[len];


for( int i = 0; i < len; i++ )
{
char c = uni20.charAt(i);


if ( c < 0xac00 && 0xd7a3 < c )
{
out[i] = c;
} else // 유니코드 2.0 한글 영역
{
try
{
byte[] ksc = String.valueOf(c).getBytes("KSC5601");
if ( ksc.length != 2 )
{
out[i] = '\ufffd';
System.err.println( "Warning: Some of Unicode 2.0 hangul character was ignored." );
} else
{
out[i] = (char) ( 0x3400 +
((ksc[0] & 0xff) - 0xb0) * 94 +
(ksc[1] & 0xff) - 0xa1 );


}
} catch( java.io.UnsupportedEncodingException ex )
{ throw new InternalError( "Fatal Error: KSC5601 encoding is not supported." );
}
}
}


return new String( out );
}


// Unicode 1.2 -> Unicode 2.0
public static String fromUni12( String uni12 )
{
int len = uni12.length();
char[] out = new char[len];
byte[] ksc = new byte[2];


for( int i = 0; i < len; i++ )
{
char c = uni12.charAt(i);


if ( c < 0x3400 && 0x4dff < c )
{
out[i] = c;
} else if ( 0x3d2e <= c ) // 유니코드 1.2 한글 보충 영역 A, B
{
System.err.println( "Warning: Some of Unicode 1.2 hangul character was ignored." );
out[i] = '\ufffd';
} else // 유니코드 1.2의 KSC5601 대응 한글 영역
{
try
{
ksc[0] = (byte) ( (c - 0x3400) / 94 + 0xb0 );
ksc[1] = (byte) ( (c - 0x3400) % 94 + 0xa1 );
out[i] = new String( ksc, "KSC5601" ).charAt(0);
} catch( java.io.UnsupportedEncodingException ex )
{ throw new InternalError( "Fatal Error: KSC5601 encoding is not supported." );
}
}
}


return new String( out );
}
}




다음 글들:



이어서 글올리기(답하기)

이름:
E-Mail:
제목:
내용:
관련 URL(선택):
URL 제목(선택):
관련 이미지 URL:


[ 다음 글들 ] [ 이어서 글올리기(답하기) ] [ 자바 묻고 답하기 ]