지식정보
JAVA 한글 MBCS(Multi Bytes Character Set) 해결
onggun
2013. 7. 29. 14:17
유니코드를 이용하지 않고 MBCS(Multi Bytes Character Set) 을 사용하는 시스템과 통신 시 싱글바이트 문자열로 변경하는 소스코드 기록한다.
/**
* 멀티바이트 한글문자를 싱글바이트 문자열로 변경 (db2 -> oracle)
* 작성 날짜: (00-06-18 오전 7:57:31)
* @return java.lang.String
* @param full java.lang.String
*/
public static String fullToHalf(String full) {
String answer = null;
int fullLength = full.length();
char[] ch1 = new char[fullLength];
full.getChars( 0, fullLength, ch1, 0 );
for ( int i = 0; i < fullLength; i++ ) {
if ( ch1[i] > 0xff00 && ch1[i] <= 0xff5e ) {
ch1[i] -= 0xfee0;
} else if ( ch1[i] == 0x3000 ) {
ch1[i] = 0x20;
}
}
answer = new String( ch1 );
// 뒷쪽 공백문자 trim
char[] ch2 = new char[fullLength];
full.getChars( 0, fullLength, ch2, 0 );
for( int i = fullLength - 1; i >= 0 ; i-- ) {
if( ch2[i] != 0x3000 && ch2[i] != 0x20 ) {
answer = answer.substring( 0, i + 1 );
break;
}
if( i == 0 ) {
answer = ""; //모두 공백
}
}
return answer;
}
/**
* 싱글바이트 한글문자를 멀티바이트 문자열로 변경 (oracle -> db2)
* 작성 날짜: (00-06-18 오전 7:48:51)
* @return java.lang.String
* @param half java.lang.String
*/
public static String halfToFull(String half) {
return halfToFull( half, ( half.length() ) * 2 );
}
/**
* 싱글바이트 한글문자를 멀티바이트 문자열로 변경 (oracle -> db2)
*
* @return java.lang.String
* @param half java.lang.String
* @param byteslength int
*/
public static String halfToFull(String half, int byteslength) {
// 전각은 2bytes이다.
if ( ( byteslength % 2 ) != 0 ) {
throw new IllegalArgumentException(
"byteslength(" + byteslength + ") is a odd number." );
}
String answer = null;
StringBuffer buf = new StringBuffer( half );
int halfLength = half.length();
int len = byteslength / 2;
char[] ch = new char[len];
buf.toString().getChars( 0, halfLength, ch, 0 );
for( int i = 0; i < halfLength; i++ ) {
if( ch[i] > 0x20 && ch[i] <= 0x7e ) {
ch[i] += 0xfee0;
} else if ( ch[i] == 0x20 ) {
ch[i] = 0x3000;
}
}
for ( int i = halfLength; i < len ; i++) {
ch[i] = 0x3000;
}
answer = new String( ch );
return answer;
}
오라클에서는 다음과 같이 간단하게 할 수 있다.
SELECT TO_SINGLE_BYTE("멀티바이트 문자열") AS STR1
, TO_SINGLE_BYTE( CHR(15711393)) AS STR2
FROM DUAL
;