헤르메스 LIFE

[오류] 보이지 않는 UniCode 오류 본문

Exception

[오류] 보이지 않는 UniCode 오류

헤르메스의날개 2021. 5. 28. 08:55
728x90

다른 시스템으로 부터 이관되어 온 ( WebService 방식 이라든지.. ) 데이터에 특수문자 등이 포함되어 문제를 일으키는 문제가 발생했습니다.

일반적으로는 문제가 되지 않지만, 아마도 웹페이지에서 텍스트를 복사해서 붙여넣으면서 딸려들어온 문자들로 보여집니다. 예를 들어 줄바꿈없는 공백(non-breaking space)

유니 코드 이름 No-Break Space
유니 코드 번호 U+00A0
HTML코드  
CSS 코드 \00A0
유니 코드  
Block 라틴-1 보충
유니 코드 버전 1.1 (1993)
public static void main( String[] args ) {
        
        //String input1 = "프랑스, FR  ";
        String input1 = "DISC 한글";
        
        System.out.println( "before :: |" + input1 + "|" );
        
        String input2 = convertUnicode(input1);
        
        System.out.println( "uni Code :: |" + input2 + "|" );
        
        input1 = StringReplace( input1 );
        
        System.out.println( "after :: |" + input1 + "|" );
        
}
    
// 한글유니코드(\uAC00-\uD7A3), 숫자 0~9(0-9), 영어 소문자a~z(a-z), 대문자A~Z(A-Z), 공백(\s)
public static String StringReplace( String str ) {
        String match = "[^\uAC00-\uD7A3xfe0-9a-zA-Z\\s]";
        str = str.replaceAll( match, "" );
        return str;
}

// String에서 유니코드로 변환
public static String convertUnicode( String val ) {
        // 변환할 문자를 저장할 버퍼 선언
        StringBuffer sb = new StringBuffer();
        // 글자를 하나하나 탐색한다.
        for ( int i = 0; i < val.length(); i++ ) {
            // 글자 추츨 int값으로 가져온다.
            int code = val.codePointAt( i );
            // 128이하면 ascii코드로 변환하지 않는다.
            if ( code < 128 ) {
                sb.append( String.format( "%c", code ) );
            } else {
                // 16진수 유니코드로 변환한다.
                sb.append( String.format( "\\u%04x", code ) );
            }
}

      

ALTER FUNCTION [dbo].[Find_Unicode]
(
    @in_string nvarchar(max)
)
RETURNS @unicode_char TABLE(id INT IDENTITY(1,1), Char_ NVARCHAR(4), position BIGINT)
AS
BEGIN
    DECLARE @character nvarchar(1)
    DECLARE @index int
 
    SET @index = 1
    WHILE @index <= LEN(@in_string)
    BEGIN
        SET @character = SUBSTRING(@in_string, @index, 1)
        IF((UNICODE(@character) NOT BETWEEN 32 AND 127) AND UNICODE(@character) NOT IN (10,11))
        BEGIN
      INSERT INTO @unicode_char(Char_, position)
      VALUES(@character, @index)
    END
    SET @index = @index + 1
    END
    RETURN
END
SELECT *
  FROM (
		SELECT  [코드]
		      , [한글코드명]
			  , ( 
						SELECT CHAR_
						  FROM (
									SELECT ROW_NUMBER() OVER (ORDER BY ID ) AS RN,  * FROM [Find_Unicode](TB_[테이블명].[한글코드명])
							   ) T
						 WHERE RN = 1 
				 ) TARGET1
		  FROM TB_[테이블명]
 ) A
 WHERE A.TARGET1 NOT LIKE '%[가-힣]%'
   AND A.TARGET1 IS NOT NULL

참조

https://avada.tistory.com/2160

https://unicode-table.com/kr/00A0/

 

728x90