01. at()

지정한 숫자(index)를 받아, 문자열에서 해당 되는 인덱스의 요소를 반환한다.

{
    const str = 'Hello, world!';

    console.log(str.at(1)); // 'e'
    console.log(str.at(-1)); // '!'
    console.log(str.at(4, 7)); // 'o'
}

문자열.at(반환할 문자의 위치값), 문자열.at(반환할 문자의 시작 위치값, 반환할 문자의 마지막 위치값)

문자열에서 특정 인덱스에 해당하는 문자를 반환하는 메서드이다.

일반적인 배열 인덱싱과는 달리 유니코드 코드 포인트를 기준으로 문자를 반환하기 때문에

서로 다른 유니코드 문자를 포함하는 문자열에서 올바른 결과를 반환한다.

또한, 인덱스가 음수일 경우 문자열의 끝에서부터 역순으로 찾는다.

이 인덱스는 반드시 정수형 숫자여야 하며, 문자열을 초과하는 값을 전달 시, undefined를 반환한다.

at( )메서드는 선택적으로 두 번째 인자를 받을 수도 있다.

이는 문자열 내에서 인덱스의 시작 위치를 나타내는 인자이며, 기본값은 0으로 문자열의 첫 번째 문자부터 인덱싱을 시작한다.

만약 두 번째 인자로 음수값이 주어지면 문자열의 끝에서부터 역순으로 찾는다.

02. charAt()

지정한 숫자(index)를 받아, 문자열에서 해당 되는 인덱스의 단일문자를 반환한다.

{
    const str = 'Hello, world!';

    const char = str.charAt(4); "o"
    const char = str.charAt(7); // "w"

    console.log(char);
}

문자열.charAt(위치값)

인자로 받은 인덱스에 해당하는 문자를 반환하며, 문자열의 길이보다 큰 인덱스를 인자로 전달하면 빈 문자열('')을 반환한다.

여기서 str은 대상 문자열이고, index는 추출하고자 하는 문자의 인덱스를 나타낸다.

index는 0부터 시작한다.

charAt() 메서드는 16비트 유니코드 문자를 반환하므로, 16비트 이상의 유니코드 문자를 처리할 경우에는 at() 메서드를 사용하는 것이 좋다.

03. charCodeAt()

지정한 숫자(index)를 받아, 문자열에서 해당 되는 인덱스의 유니코드 정수 값을 반환한다.

{
    const str = 'Hello, world!';

    const code = str.charCodeAt(0);  // 72
    const code = str.charCodeAt(7);    //119
    console.log(code); 
}

문자열.charCodeAt(위치값)

문자열의 인덱스를 입력으로 받아, 해당 인덱스에 위치한 문자의 유니코드 값을 10진수로 반환한다.

위 예제에서, charCodeAt(0)은 문자열 str의 첫 번째 인덱스인 'H'에 해당하는 유니코드 값 72를 반환한다.

문자열에서 특정 문자의 인덱스를 알고자 할 때 유용하게 사용된다.

또한, 유니코드 값을 기반으로 문자열을 정렬하거나 비교하는 등의 작업에서도 활용될 수 있다.

04. charPointAt()

지정한 숫자(index)를 받아, 문자열에서 해당 되는 인덱스의 유니코드 포인트 정수 값을 반환한다.

{
    const str = '𐐀hello';

    const code = str.codePointAt(0);
    console.log(code); // 66304
}

문자열.charPointAt(위치값)

codePointAt()는 charCodeAt()와 유사하지만, charCodeAt()는 16비트 유니코드 문자만 처리할 수 있는 반면, codePointAt()는 21비트 유니코드 문자까지 처리할 수 있다.

21비트 유니코드 문자는 기본 다국어 평면(BMP)에 있는 문자와 이를 초과하는 보충 다국어 평면(SMP)에 있는 일부 문자들을 포함한다.

문자열의 인덱스를 인수로 받아 해당 인덱스에 위치한 문자의 코드 포인트 값을 반환한다.

코드 포인트는 문자를 유니코드로 인코딩한 값으로, 10진수로 표현된다.

codePointAt(0)은 문자열 str의 첫 번째 인덱스인 SMP 문자 '𐐀'에 해당하는 코드 포인트 값 66304를 반환한다.

codePointAt() 메소드는 charCodeAt() 메소드와 달리, 코드 포인트를 처리할 수 있으므로 전 세계의 다양한 문자를 다루는 애플리케이션에서 유용하게 사용될 수 있다.

05. concat()

전달된 문자열을 받아, 결합된 새로운 문자열을 반환한다.

{
    const array1 = ['a', 'b', 'c'];
    const array2 = ['d', 'e', 'f'];
    const array3 = ['g', 'h', 'i'];

    const newArray = array1.concat(array2, array3);
    console.log(newArray); // ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']



    const array1 = ['a', 'b', 'c'];
    const value1 = 'd';
    const value2 = ['e', 'f'];
    const value3 = { g: 'h' };

    const newArray = array1.concat(value1, value2, value3);
    console.log(newArray); // ['a', 'b', 'c', 'd', 'e', 'f', { g: 'h' }]
}

문자열.concat(문자열, 문자열)

배열의 모든 요소를 하나의 배열로 합쳐서 새로운 배열을 반환한다다.

이 메소드는 기존 배열을 변경하지 않고, 합쳐진 새로운 배열을 반환한다.

인수로 배열 뿐만 아니라 값도 받을 수 있습니다.

이 경우에는 값을 원소로 갖는 배열로 변환하여 합친다.

06. includes()

문자열 포함 여부를 검색하여, 불린(true, false)을 반환한다.

{
    "javascript reference".includes("javascript");          //true
    "javascript reference".includes("j");                   //true
    "javascript reference".includes("J");                   //false
    "javascript reference".includes("a");                  //true
    "javascript reference".includes("reference");           //true
    "javascript reference".includes("reference",11);          //true
    "javascript reference".includes("reference",12);          //true
}

문자열.includes(검색값, [위치값])

배열 또는 문자열에서 특정 값이 존재하는지 확인하는 메서드이다.

값이 존재하면 true, 존재하지 않으면 false를 반환한다.

07. indexOf( )

문자열을 검색하여, 주어진 값과 일치하는 첫 번째 위치값(index)을 반환한다.

{
    console.log("javascript reference".indexOf("javascript"));         // 0 (값이 존재시 인덱스 값 반환)
    console.log("javascript reference".indexOf("javascripts"));         //-1 (존재하지 않을 시 음수 반환)
    console.log("javascript reference".indexOf("j"));                  //0 (j가 제일 앞자리에 있으므로 0 반환)
    console.log("javascript reference".indexOf("J"));                  //-1
    console.log("javascript reference".indexOf("a"));                  //1 (a가 1번과 3번에 있지만 여러 개의 값을 전부 반환하지 않고 제일 앞의 값만 반환)
    console.log("javascript reference".indexOf("ja"));                 //0
    console.log("javascript reference".indexOf("jv"));                 //-1
    console.log("javascript reference".indexOf("reference"));         //11
    console.log("javascript reference".indexOf("r"));                  //6
    console.log("javascript reference".indexOf("re"));                 //11

    console.log("javascript reference".indexOf("javascript", 0));          //0 정수는 위치값을 의미한다. 따라서 결과값은 0
    console.log("javascript reference".indexOf("javascript",5));           //-1 javascript가 5번째 자리부터 시작하지 않으므로 -1.

    console.log("javascript reference".indexOf("r",7));                    //11 "javascript reference"에서 7번째 'r'eference를 제외한 두 번째 r 즉, refe'r'ence의 자리값이 11이므로 결과값은 11이 된다.
    console.log("javascript reference".indexOf("r",12));                   //15  "javascript reference"에서 두 번째 r의 자릿수는 11이다. 12번째 자리 이후로도 refe'r'ence가 있기 때문에 결과값은 15가 된다.

}

indexOf

배열 또는 문자열에서 특정값 또는 문자열이 처음 나타나는 위치의 인덱스를 반환한다.

값 또는 문자열이 존재하지 않으면 -1을 반환하고, 문자열이 있으면 0을 반환한다.

또한 해당하는 값이 여러 개 존재하면 가장 앞에 있는 값 위치의 인덱스를 반환한다.

08. lastindexOf( )

메서드는 문자열을 역순으로 검색하여, 주어진 값과 일치하는 첫 번째 위치값(index)을 반환한다.

{
    "javascript reference".lastIndexOf("javascript");
    console.log("javascript reference".lastIndexOf("javascript"));                      //0
    console.log("javascript reference".lastIndexOf("javascripts"));                     //-1
    console.log("javascript reference".lastIndexOf("j"));                               //0
    console.log("javascript reference".lastIndexOf("a"));                               //3
    console.log("javascript reference".lastIndexOf("jv"));                              //-1
    console.log("javascript reference".lastIndexOf("reference"));                       //11
    console.log("javascript reference".lastIndexOf("r"));                               //15
    console.log("javascript reference".lastIndexOf("javascript",0));                    //0
    console.log("javascript reference".lastIndexOf("javascript",1));                    //0
    console.log("javascript reference".lastIndexOf("reference",0));                     //-1
    console.log("javascript reference".lastIndexOf("reference",11));                    //-1  ✔1
    console.log("javascript reference".lastIndexOf("reference",12));                    //11  ✔2
}

lastindexOf

배열 또는 문자열에서 특정값 또는 문자열이 마지막으로 나타나는 위치의 인덱스를 반환한다.

값 또는 문자열이 존재하지 않으면 -1을 반환하고, 문자열이 있으면 0을 반환한다.

또한 해당하는 값이 여러 개 존재하면 가장 뒤에 있는 값 위치의 인덱스를 반환한다.


✔1 검색을 인덱스 11에서 시작하기 대문에 메서드는 javascript r 하위 문자열 내애서만 검색한다.

reference 하위 문자열은 이 하위 문자열 내에서 찾을 수 없으므로 이 메서드는 -1을 반환한다.


✔2 검색을 전체 문자열인 javascript reference에서 시작하기 때문에 reference 하위 문자열의 마지막 발생을 인덱스 11에서 찾는다.

09. localeCompare()

문자열과 문자열을 비교하여, 수치(음수, 양수, 0)을 반환한다.

{
    const str1 = 'hello';
    const str2 = 'world';
    const str3 = 'Hello';
 
    console.log(str1.localeCompare(str2)); // -1  (문자열2가 문자열 1보다 사전순(알파벳 순서상)으로 뒤에 오기 때문)
    console.log(str2.localeCompare(str1)); // 1 (문자열 1이 문자열 2보다 사전순으로 앞에 오기 때문)
    console.log(str1.localeCompare(str3)); // 1 (문자열 1이 문자열 1보다 앞에 오기 때문 / 대소문자를 구분하기 때문에 다른 문자열로 인식함)
    console.log(str1.localeCompare(str1)); // 0 (문자열 1과 문자열 1의 위치가 같음)
}

문자열.localeCompare(compareString [, locales [, options]])

compareString: 현재 문자열과 비교할 다른 문자열이다.

locales (선택적): 비교에 사용할 로케일(언어와 국가)을 나타내는 문자열 배열이다.

options (선택적): 다양한 비교 옵션을 나타내는 객체이다.

주어진 문자열과 비교 문자열의 정렬 순서를 비교하여, 비교 결과에 따라 -1, 0, 1 중 하나를 반환한다.

문자열을 다른 문자열과 비교하여 정렬 순서를 결정하는데 사용된다.

이 메소드는 두 문자열을 비교하여 결과에 따라 3가지 값을 반환한다.

0보다 작은 값: 첫 번째 문자열이 두 번째 문자열보다 앞선다.

0: 두 문자열이 동일하다.

0보다 큰 값: 첫 번째 문자열이 두 번째 문자열보다 뒤에 온다.

로케일(언어, 국가, 문화권 등)을 기반으로 문자열을 비교하기 때문에, 다양한 언어와 문자 집합에서 사용할 수 있다.

기본적으로 유니코드 순서로 문자열을 비교한다.

또한 localeCompare() 메소드는 대소문자를 구분한다.

10. match()

문자열(정규식)을 검색하고, 문자열(배열)을 반환한다.

{
    "javascript reference".match("javascript");
    console.log("javascript reference".match("javascript"));            //javascript
    console.log("javascript reference".match("reference"));             //reference
    console.log("javascript reference".match("r"));                     //r
    console.log("javascript reference".match("J"));                     //null
    console.log("javascript reference".match(/reference/));             //reference
    console.log("javascript reference".match(/Reference/));             //null
    console.log("javascript reference".match(/Reference/i));            //reference
    console.log("javascript reference".match(/Reference/g));            //rerfrence
    console.log("javascript reference".match(/r/));                     //r
    console.log("javascript reference".match(/r/g));                     //rrr
    console.log("javascript reference".match(/w/g));                     //null
    console.log("javascript Reference".match(/R/ig));                     //r R r
}

match()

문자열.match(검색값) (정규식 표현)

match 메서드는 문자값 (배열)을 반환한다.

일치하는 값이 없으면 null을 반환한다

검색 시 대소문자를 구별한다.

12. normalize()

주어진 문자열을 정규화된 형태로 반환한다.

{
    const str1 = 'é';
    const str2 = 'é';
    console.log(str1 === str2); // false

    const normalizedStr1 = str1.normalize();
    const normalizedStr2 = str2.normalize();
    console.log(normalizedStr1 === normalizedStr2); // true

    const str = 'ộ';
    console.log(str.length); // 2

    const nfdStr = str.normalize("NFD");
    console.log(nfdStr.length); // 3

    const nfcStr = str.normalize("NFC");
    console.log(nfcStr.length); // 2
}

문자열.normalize([form])

normalize() 메소드는 유니코드 문자열을 정규화하여 문자열에서 여러 버전의 같은 문자를 하나의 표준 문자로 표현한다.

예를 들어, "é"와 "é"는 같은 문자이지만 서로 다른 유니코드 문자열이다.

이 경우 normalize() 메소드를 사용하여 두 문자열을 모두 같은 문자로 정규화할 수 있다.

normalize() 메소드는 문자열의 각 문자를 유니코드 정규화를 사용하여 노멀 폼(normal form)으로 변환한다.

노멀 폼에는 다음 4가지가 있다.

NFC (Normalization Form Canonical Composition)

모든 음절을 Canonical Decomposition(정준 분해) 후 Canonical Composition(정준 결합) 하는 방식

NFD (Normalization Form Canonical Decomposition)

정준분해(Canonical Decomposition) 중 하나로, 유니코드 문자열에서 조합형 문자(combining character)를 분리하여 기본문자(base character)와 조합 문자열(combining sequence)로 분해하는 과정. (ex. 문자열 "é"는 NFD로 분해하면 기본문자 'e'와 조합 문자열 '´'으로 분리된다.)

NFKC (Normalization Form Compatibility Composition)

유니코드 문자열에서 호환성 분해(compatibility decomposition)3된 문자열을 정준결합(Canonical Composition)하여 결합 문자(composed character)로 변환하는 과정

NFKD (Normalization Form Compatibility Decomposition)

유니코드 문자열에서 호환성 결합(compatibility composition) 5문자열을 정준분해(Canonical Decomposition)하여 분해 문자(decomposed character)로 변환하는 과정.

NFC와 NFKC는 대부분의 경우 문자열을 합성하는 것이며, NFD와 NFKD는 문자열을 분해한다.

일반적으로 NFC를 사용하는 것이 권장된다.

선택적 매개변수로 노멀 폼(normal form)을 지정할 수 있다.

예를 들어, normalize("NFD")를 호출하면 NFD 노멀 폼으로 문자열을 분해한다.

"ộ" 문자열을 노멀 폼으로 변환한다. 원래 문자열의 길이는 2이지만, NFD 노멀 폼으로 변환하면 3으로 늘어나게 된다.

13. padEnd()

주어진 길이에 맞게 뒤 문자열을 채우고, 새로운 문자열을 반환한다.

{
    const str = 'hello';
    const paddedStr = str.padEnd(10, 'world');
    console.log(paddedStr); // "helloWorld"
    console.log(str); // "hello"
}

문자열.padEnd(targetLength [, padString])

현재 문자열의 끝에 지정된 길이만큼 다른 문자열을 추가하여 새로운 문자열을 생성한다.

이 때 추가하는 문자열은 기본적으로 공백이다.

targetLength: 현재 문자열의 길이와 합해서 목표로 하는 총 길이이다. 이 값보다 현재 문자열의 길이가 길면 추가적인 문자열을 삽입하지 않는다.

padString (선택적): 현재 문자열의 끝에 추가할 다른 문자열이다. 이 값이 지정되지 않으면 기본값으로 공백이 사용된다.

14. padStart()

주어진 길이에 맞게 앞 문자열을 채우고, 새로운 문자열을 반환한다.

{
    const str = 'hello';
    const paddedStr = str.padStart(10, 'world');
    console.log(paddedStr); // "worldhello"
    console.log(str); // "hello"
}

문자열.padStart(targetLength [, padString])

targetLength: 현재 문자열의 길이와 합해서 목표로 하는 총 길이입니다. 이 값보다 현재 문자열의 길이가 길면 추가적인 문자열을 삽입하지 않는다.

padString (선택적): 현재 문자열의 시작 부분에 추가할 다른 문자열입니다. 이 값이 지정되지 않으면 기본값으로 공백이 사용된다.

문자열을 수정하지 않고, 새로운 문자열을 반환한다.

위 예제에서는 padStart() 메소드를 사용하여 문자열 "hello"의 시작 부분에 "world" 문자열을 추가하여 길이가 10이 되는 새로운 문자열을 만든다.

결과적으로 paddedStr 변수에는 "worldhello" 문자열이 할당된다.

15. repeat()

주어진 횟수만큼 반복 복사하여, 새로운 문자열을 반환한다.

{
    const str = 'hello';
    const repeatedStr = str.repeat(3);
    console.log(repeatedStr); // "hellohellohello"

    const str = 'hello';
    const repeatedStr = str.repeat(0);
    console.log(repeatedStr); // ""
}

문자열.repeat(반복할 횟수)

문자열을 지정된 횟수만큼 반복하여 새로운 문자열을 생성하는 메서드이다.

이 때, 반복할 횟수는 정수로 지정해야 한다.

반복할 횟수가 0이거나 음수이면 빈 문자열을 반환한다.

이전에는 for( ) 루프를 통하여 문자열을 반복해야만 했지만 이제는 repeat 메서드를 사용하여 간결하게 사용할 수 있다.

18. search()

문자열(정규식)을 검색하고, 위치값(숫자)을 반환한다.

{
    "javascript reference".search("javascript");              //0
    "javascript reference".search("reference");               //11
    "javscript reference".search("r");                        //6
    "javascript reference".search("a");                        //1
    "javascript reference".search("jv");                       //-1
    "javascript reference".search("J");                        //-1
    "javascript reference".search(/reference/);               //11
    "javascript reference".search(/Reference/);               //-1
    "javascript reference".search(/Reference/i);               //11 따옴표 대신 /를 사용하고 i 작성 시 대소문자를 구별하지 않음. (정규식 표현 방법임)
    "자바스크립트".search(/[a-z]/g);                             //-1 a-z까지 알파벳을 사용했는지 검사하는 구문이다. 한글을 사용하였으므로 -1이 된다.
}

search()

문자열.search(검색값) (정규식 표현)

문자열(정규식)을 검색하여 위치값(숫자/index)를 반환한다.

일치하는 것이 없을 시 -1을 반환한다.

검색 시 대소문자를 구별한다.

19. slice( )

문자열에서 일부분을 추출하여 새로운 문자열을 반환하는 함수

{
    let str = "hello world";
    let subStr = str.slice(0, 5);

    console.log(subStr); // 출력결과: "hello"
}

slice( )

문자열.slice(시작 위치)

문자열.slice(시작 위치, 끝 위치)

첫 번째 인수로 시작 위치를, 두 번째 인수로 추출할 부분의 위치를 지정한다.

첫 번째 인수는 필수적이며, 두 번째 인수는 선택적이다.

두 번째 인수를 생략하면 추출할 문자열은 첫 번째 인수로 지정된 위치부터 문자열의 끝까지를 추출하여 반환한다.

slice( ) 함수는 인수값을 음수로도 받을 수 있다.

20.substring( )

문자열에서 지정된 위치에 있는 문자들의 부분 문자열(substring)을 반환한다.

{
    let str = "hello world";
    let subStr = str.substring(0, 5);

    console.log(subStr); // 출력결과: "hello"   
}

substring( )

문자열.substring(시작 위치)

문자열.substring(시작 위치, 끝 위치)

이 메서드는 문자열 객체의 메서드로 사용된다.

substring( ) 메서드는 두 개의 매개변수를 가질 수 있다.(추출할 부분의 시작 위치와 끝 위치를 인수로 받는다)

첫 번째 매개변수는 부분 문자열의 시작 인덱스이고, 두 번째 매개 변수는 부분 문자열의 끝 인덱스이다.

두 번째 매개변수는 생략할 수 있으며, 생략한 경우 끝부분까지 부분 문자열을 반환한다.

substr( )함수와 비슷하게 동작하지만 시작 위치와 추출할 문자열의 길이를 받는 substr과는 다르게

substring( )함수는 시작 위치와 끝 위치를 인수로 받는다.

22.split( )

문자열을 지정한 구분자를 기준으로 분할할여 배열로 반환하는 함수

{
    let str = "apple,banana,kiwi";
    let arr = str.split(",");

    console.log(arr); // 출력결과: ["apple", "banana", "kiwi"]
}

split( )

문자열. split(구분자[제한])

이 함수는 문자열 객체의 메서드로 사용된다.

구분자로는 문자열, 정규식 등을 줄 수 있으며 지정하지 않는 것도 가능하다.

주로 문자열을 파싱하거나 특정 문자열을 기준으로 분할해야할 때 사용된다.

30.trim( )

문자열 양 끝의 공백을 제거하는데 사용된다.

{
    const str = "   Hello, World!   ";
    const trimmedStr = str.trim(); // "Hello, World!"
}

split( )

trim( ) 메서드는 공백이 제거된 새 문자열을 반환한다.

원본 문자열은 변경시키지 않는다.

trim( ) 메서드는 사용자가 입력한 폼 데이터의 공백 제거,

문자열 검색을 위해 문자열의 앞뒤 공백 제거,

문자열을 비교하기 전에 앞뒤 공백을 제거하여 정확한 비교 수행 등에 사용된다.

31.trimStart()

문자열을 지정한 구분자를 기준으로 분할할여 배열로 반환하는 함수

{
    let str = "apple,banana,kiwi";
    let arr = str.split(",");

    console.log(arr); // 출력결과: ["apple", "banana", "kiwi"]
}

trimStart()

trimStart()문자열. split(구분자[제한])

trimStart()이 함수는 문자열 객체의 메서드로 사용된다.

구분자로는 문자열, 정규식 등을 줄 수 있으며 지정하지 않는 것도 가능하다.

주로 문자열을 파싱하거나 특정 문자열을 기준으로 분할해야할 때 사용된다.

32.trimEnd()

문자열 끝의 공백 문자를 제거한 후 새로운 문자열을 반환하는 메서드.

{
    const str = "     Hello World!     ";
    console.log(str.trimEnd()); // "     Hello World!"
}

trimEnd()

문자열.trimEnd( )

문자열 끝에 여러 개의 공백이 있을 경우 모든 공백을 제거한다.

원본 문자열을 변경하지 않으면서 공백을 제거한 새로운 문자열을 반환한다.

trim( )과 달리 문자열 끝의 공백만을 제거한다.

01. 유니코드 코드 포인트

유니코드에서 문자를 나타내는데 사용되는 고유한 정수값

유니코드 코드 포인트

유니코드 코드 포인트는 0부터 00x10FFFF(1,114,1110)까지의 21비트 정수로 표현된다.

코드 포인트는 16진수로 나타내어지며, U+XXXX와 같은 형식으로 표기된다.

여기서 XXXX는 16진수 코드 포인트 값이다.

예를 들어, 영어 대문자 'A'의 코드 포인트는 U+0041이고,

한글 'ㄱ'의 코드 포인트는 U+3131입니다. 이와 같이 모든 문자와 기호는 고유한 코드 포인트를 가지고 있다.

JavaScript에서는 문자열을 UTF-16 인코딩으로 표현한다.

따라서 JavaScript의 문자열 메서드 중 일부는 코드 포인트를 기준으로 작동한다.

예를 들어, String.prototype.charAt() 메서드는 16비트 단위로 문자열을 나누어 인덱싱하기 때문에, 16비트 이상의 유니코드 문자열에 대해서는 잘못된 결과를 반환할 수 있다.

그러나, String.prototype.at() 메서드는 코드 포인트를 기준으로 인덱싱하기 때문에, 16비트 이상의 유니코드 문자열에 대해서도 올바른 결과를 반환한다.

02. 보충 다국어 평면(SMP, Supplementary Multilingual Plane)

유니코드에서 기본 다국어 평면(BMP, Basic Multilingual Plane) 이외의 문자들을 저장하는 평면

보충 다국어 평면(SMP, Supplementary Multilingual Plane)

유니코드는 전 세계의 문자를 하나의 문자 집합으로 표현하기 위한 국제 표준이다.

BMP는 유니코드에서 0부터 65535까지의 코드 포인트를 할당하는 1번째 평면이다.

하지만 BMP에는 모든 문자를 담을 수 없기 때문에 보충 다국어 평면(SMP)과 추가 보충 다국어 평면(SIP)이 추가되었다.

SMP는 65536부터 1114111까지의 코드 포인트를 사용한다.

SMP에 있는 문자들은 2개의 16비트 유니코드 코드 유닛으로 표현된다.

BMP에 있는 문자는 1개의 16비트 유니코드 코드 유닛으로 표현된다.

03. 정준분해(Canonical Decomposition)

유니코드 문자열에서 조합형 문자(combining character)를 분리하여 기본문자(base character)와 조합 문자열(combining sequence)로 분해하는 과정

정준분해

유니코드 문자열에서 조합형 문자(combining character)를 분리하여 기본문자(base character)와 조합 문자열(combining sequence)로 분해하는 과정을 말한다.

이를 통해 문자열을 더 세밀하게 분해하고, 결합 문자와 기본 문자를 분리하여 처리할 수 있다.

예를 들어, 문자열 é는 기본문자 e와 조합 문자열 ´으로 분해된다.

04. 정준결합(Canonical Composition)

유니코드 문자열을 다시 결합하여 원래 문자열로 복원하는 과정.

정준결합

정준결합은 정준분해의 반대 과정으로, 유니코드 문자열에서 결합 문자 시퀀스를 결합하여 하나의 문자로 만드는 과정이다.

이를 통해 문자열을 더 간단하게 처리할 수 있다.

예를 들어, e와 ´의 결합 문자 시퀀스를 정준결합하면 é라는 하나의 문자로 처리된다.

정준분해와 정준결합은 문자열의 표준화에 중요한 역할을 한다.

다양한 인코딩과 표현 방식이 존재하는 유니코드에서는 문자열 처리의 일관성을 유지하기 위해 이러한 표준화 기술이 필수적이다.

05. 호환성 분해(Compatibility Decomposition)

유니코드에서는 같은 의미를 갖지만 문자 코드가 다른 문자들을 하나의 표준 문자로 통합하는 과정.

호환성 분해(Compatibility Decomposition)

정준분해, 정준결합과 유사하지만, 유니코드 버전 2.0 이전에 사용되었던 문자열 표현 방식인 ASCII와 호환성을 유지하기 위해 추가된 기술이다.

유니코드 문자열에서 기본 문자와 결합 문자를 분해할 때, ASCII와의 호환성을 유지하기 위해 일부 유니코드 문자를 ASCII 문자로 대체하는 것이다.

예를 들어, "①"라는 문자는 유니코드에서는 1과 ⓪의 결합 문자 시퀀스로 이루어져 있지만, 호환성 분해를 하면 1로 대체된다.

06. 호환성 결합(Compatibility Composition)

호환성 분해의 반대로, 유니코드 문자열에서 호환성을 유지하기 위해 일부 유니코드 문자를 ASCII 문자로 대체하여 결합하는 것.

호환성 결합(Compatibility Composition)

유니코드 문자열에서 호환성을 유지하기 위해 일부 유니코드 문자를 ASCII 문자로 대체하여 결합하는 것이다.

예를 들어, 1과 ⓪의 결합 문자 시퀀스를 호환성 결합하면 ①라는 문자로 대체된다.

하지만 호환성 분해와 결합은 일반적으로 사용되지 않습니다. 왜냐하면 유니코드 버전 2.0 이후에는 이러한 호환성 기능이 필요 없어졌기 때문이다.

대부분의 프로그래밍 언어와 플랫폼은 이러한 호환성을 지원하지 않으며, 정준 분해와 결합을 사용하는 것이 권장된다.

07. 결합 문자(Combining Character)

문자의 일부분으로 표시되지만, 다른 문자와 결합하여 다른 문자를 만들어내는 문자

결합 문자(Combining Character)

대표적으로 악센트 기호나 조합된 문자 등이 결합 문자에 해당한다.

예를 들어, é라는 문자는 문자 e와 악센트 기호(´)의 결합 문자이다.

유니코드에서는 이러한 결합 문자를 따로 구분하여 코드 포인트로 정의한다.

하지만, 이러한 결합 문자는 렌더링될 때 기본 문자와 결합하여 새로운 문자를 만들어내므로, 문자열 처리에 있어서 주의가 필요하다.

결합 문자는 문자열의 정렬이나 검색 등에서 문제를 일으킬 수 있다.

예를 들어, café와 café는 결합 문자 é를 포함하고 보이는 모습상으로는 거의 비슷해 보이지만,다른 문자열이다.

café는 악센트 기호(´)와 문자 e가 결합하여 만들어진 é 문자를 포함하는 반면, café는 일반적인 문자 e 뒤에 악센트 기호가 따로 붙어있는 결합 문자(sequence)이다.

이러한 차이점으로 인해 café와 café는 문자열 처리에서 다른 문자열로 인식된다.

이와 같은 문제를 해결하기 위해서는 문자열의 정규화(Normalization)가 필요한 것이다.

08. 결합 문자 시퀀스

문자열 내에서 연속적으로 결합되어 있는 하나 이상의 결합 문자들을 의미.

결합문자 시퀀스

여기서 시퀀스(sequence)란, 순서대로 배열되어 있는 것을 의미한다.

예를 들어, 문자열 café의 경우, 문자 e 뒤에 결합 문자인 악센트 기호(´)가 따로 붙어있는 형태이므로, e와 ´를 각각의 문자로 인식하지 않고, "e´"를 하나의 결합 문자로 처리한다.

이 때, e´를 é로 변환하여 처리하게 된다.

이처럼 결합 문자 시퀀스를 처리하면, 올바른 문자열을 처리할 수 있다.