티스토리 뷰

반응형

UTF-8 기준 문자열 길이 계산

UTF-8은 문자코드 값에 따라 문자당 1~4 Byte를 사용합니다. JavaScript에서 UTF-8 Byte 길이 계산 시 주의해야 할 부분이 있는데, JavaScript는 내부적으로 문자열을 UTF-16(UCS-2)로 처리하기 때문에 UTF-16의 특성을 고려해주어야 합니다. 예를들어 UTF-8에서 4Byte 문자인 '𒀀'의 경우 UTF-16에서는 문자 2개를 결합하여 표현합니다. 아래 함수는 이러한 특성을 고려하여 작성되어 있습니다.

function getByteLengthOfUtf8(str) {
    //UTF8 기준 Byte Length 계산
    var byteLength = 0;
    for (var i = 0, strLength = str.length; i < strLength; i++) {
        var code = str.charCodeAt(i);
        if (code < 0x0080) {
            //[0x0000, 0x007F]
            byteLength += 1;
        }
        else if (code < 0x0800) {
            //[0x0080, 0x07FF]
            byteLength += 2;
        }
        else if (code < 0xD800) {
            //[0x0800, 0xD7FF]
            byteLength += 3;
        }
        else if (code < 0xDC00) {
            //[0xD800, 0xDBFF]
            var codeNext = str.charCodeAt(++i);
            if (i < strLength && codeNext >= 0xDC00 && codeNext <= 0xDFFF) {
                //followed by [0xDC00, 0xDFFF]
                byteLength += 4;
            }
            else {
                throw new Error("UCS-2 String malformed");
            }
        }
        else if (code < 0xE000) {
            //[0xDC00, 0xDFFF]
            throw new Error("UCS-2 String malformed");
        }
        else {
            //[0xE000, 0xFFFF]
            byteLength += 3;
        }
    }
    return byteLength;
}

EUC-KR 기준 문자열 길이 계산

EUC-KR은 ANSI에 한글을 확장한 완성형 코드집합입니다. 문자코드 127까지는 영어, 숫자, 특수문자 등을 1Byte 내에서 표현하며, 문자코드 128부터는 한글을 2Byte로 표현합니다. 따라서 다음과 같은 함수로 계산할 수 있습니다. 개행문자 (Code가 10)인 경우 \r\n임을 고려해 2Byte로 계산하며, 비트 시프트 연산자 >> 7을 사용하여 128부터 2Byte로 계산되도록 하고 있습니다.

function getByteLengthOfEucKr(text) {
    //EUC-KR 기준 Byte Length 계산
    if (text == null || text == "")
        return 0;
    var byteLength, i, code;
    for (byteLength = i = 0; code = text.charCodeAt(i++); byteLength += (code == 10) ? 2 : ((code >> 7) ? 2 : 1));
    return byteLength;
}

출처

 

'Web > JavaScript' 카테고리의 다른 글

[JavaScript] 진법변환 코드  (0) 2023.06.19
댓글