반응형


단언컨대 웹상에 나와있는 classic asp 에서 한글 자릿수 계산하는 함수들은 대부분 오동작을 일으킨다.

유니코드 코드페이지에서 어설프게 대부분 asc를 여전히 갖다 쓰는가 하면 설령 ascw를 사용하여도 제대로 동작할리가 없다.

아래 함수에서처럼 len(hex(ascw(strCut)))를 사용해야만 정확히 한글의 글자 크기를 반환할 수 있다.


    function fnStrLength(str)

        Dim strLen, strByte, strCut, strRes, char, i 

        strLen = 0 

        strByte = 0 

        strLen = Len(str) 

        for i = 1 to strLen 

            char = "" 

            strCut = Mid(str, i, 1) 

            char = len(hex(ascw(strCut)))

            

            'if Len(char) = 1 And char = "1" then 

            if char = 2 then

                strByte = strByte + 1

            else 

                strByte = strByte + 2 

            end if 

        next 

        fnStrLength = strByte

    End function


테스트 해보면 '가'는 4자리 이므로 나누기 2를 하여 2를 반환하고 'a'는 2자리 이므로 나누기 1을 하여 1을 반환한다.

중요한 자음 또는 모음 하나만 존재할 때도 'ㅇ'는 4자리 이므로 2를 반환하는 등 정확히 동작한다.


앞단에선 javascript로 체크하고 뒷단에선 classic asp로 이 함수를 이용하여 체크하면 모두 원하는 값을 받아볼 수 있을것이다.

<textarea name="SS_CONTENT" id="SS_CONTENT" placeholder="내용" style="width:99.5% !important; height: !important;" maxlength="400" onKeyUp="javascript:fnChkByte($('#SS_CONTENT'), 80)"></textarea>

    function fnChkByte(obj, maxNum) {
        var byteSize = 0;

        for (var idx = 0; idx < obj.val().length; idx++) {
            var oneChar = escape(obj.val().charAt(idx));
            if (oneChar.length == 1) {
                byteSize++;
            } else if (oneChar.indexOf("%u") != -1) {
                byteSize += 2;
            } else if (oneChar.indexOf("%") != -1) {
                byteSize++;
            }
        }
        if (byteSize > maxNum) {
            // 자릿수 초과 처리
        } else {
            // 자릿수 비초과 처리
        }
    }


반응형
Posted by Hippalus
,