티스토리 뷰

유니코드를 이용하지 않고 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
;
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday