charAt() method๋ ํน์ ์ธ๋ฑ์ค์ ์์นํ ๋ฌธ์์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํ๋์ UTF-16 ์ฝ๋๋ก ๊ตฌ์ฑ๋ ์ ๋ฌธ์์ด์ ๋ฐํํ๋ค.
Copy const title = "The Phantom of The Opera - FULL STAGE SHOW";
const index = 4;
console.log(title.charAt(index)); // expected output: P
Syntax
Copy character = str.charAt(index)
Parameters
index
0๊ณผ string์ length๋ณด๋ค -1์ธ ์ ์. ์ธ๋ฑ์ค๊ฐ ์ ๊ณต๋์ง ์์ผ๋ฉด default๊ฐ 0์ด ๋์ด ์ฒซ๋ฒ์งธ ๋ฌธ์๋ฅผ ๋ฐํํ๋ค.
Return value
์ง์ ๋ ์ธ๋ฑ์ค์์ ๋ฌธ์(์ ํํ ํ๋์ UTF-16์ฝ๋)๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด์ด๋ค.
index ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๊ฒฝ์ฐ ๋น ๋ฌธ์์ด
Examples
๋ฌธ์์ด ๋ด์ ๋ค๋ฅธ ์์น์ ์๋ ๋ฌธ์๋ค ์ถ๋ ฅํ๊ธฐ
Copy const anyString = "it will be available to watch until Sunday 11am PT / 2pm ET**";
console.log(`index:0, character: ${anyString.charAt(0)}`);
console.log(`index:1, character: ${anyString.charAt(1)}`);
console.log(`index:2, character: ${anyString.charAt(2)}`);
index:0, character: "i"
index:1, character: "t"
index:2, character: ""
์ ์ฒด๋ฌธ์ ์ป๊ธฐ
๋ฌธ์์ด์ ๊ธฐ๋ณธ ๋ค๊ตญ์ด ํ๋ฉด์ ์๋ ๋ฌธ์๊ฐ ํฌํจ ๋ ๊ฒฝ์ฐ์๋ ๋ฌธ์์ด ๋ฃจํ๋ฅผ ํต๊ณผํ ๋ ํญ์ ์ ์ฒด ๋ฌธ์๋ฅผ ์ ๊ณตํ๋๋ก ํ๋ ๋ฐฉ๋ฒ
๋น๊ตฌ์กฐํ ํ ๋น์ ์ฌ์ฉํ๋๊ฒ ๋ ๊ฐ๊ฒฐํ๊ณ , ๋ฌธ์๊ฐ surrogate pair๊ฐ ๋๋๊ฒ์ ํ์ฉํ ๋๋ ์ฆ๊ฐํด์ผ ํ๋ ๋ณ์๋ฅผ ์๋์ ์ผ๋ก ์ฆ๊ฐํ๊ธฐ์ ๋ ์ ์ฐํ๋ค.
Copy let str = 'A\uD87E\uDC04Z';
for (var i = 0, chr; i < str.length; i++) {
console.log(str.charAt(i));
}
// expected output: "A"
// "๏ฟฝ"
// "๏ฟฝ"
// "Z"
console.log(str.charAt(1) + str.charAt(2)) // "ไฝ "
for๋ฌธ์ ๊ทธ๋ฅ ๋๋ฆฌ๋ฉด "๏ฟฝ"
์ด ๋ฌธ์์ ์ฌ์ค ํ์ 1๊ฐ์ธ๋ฐ "๏ฟฝ" X 2๊ฐ๊ฐ ๋์๋ค. Surrogate pair๋ ๋๊ฐ์ ์์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฌธ์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
UTF-16 ์ฝ๋๊ฐ 6๋ง 5์ฒ ๊ธ์๋ฅผ ๋์ด์๋ ๊ธ์๋ค์ ํํํ๊ธฐ ์ํด ๋์
๋์๋๋ฐ..
Supplementary Characters๋ ์ ๋์ฝ๋์ 2๋ฐ์ดํธ ๊ธฐ๋ณธ ๋ฒ์์ ์ํ๋ BMP(Basic Multilingual Plane: Plane 0) ์์ญ์ ๋์ด์ ๊ธ์๋ค์ ๋งํ๊ณ Surrogate Pair๋ ์ด ๋ฒ์ฃผ์ ์ํ๋ Supplementary Characters๋ฅผ ํํํ๊ธฐ ์ํด UTF-16์ ๋์
๋ ์ธ์ฝ๋ฉ ๋ฐฉ์์ด๋ค. 16๋นํธ ์ฝ๋ ๋๊ฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ํ๋๋ฅผ ํํํ ๊ฒ์ surrogate pair๋ผ๊ณ ํ๋ฉฐ high surrogate, low surrogate๋ก ์ด๋ฃจ์ด์ง
Copy let str = 'A\uD87E\uDC04Z'; // ๋ํ ๋น BMP ๋ฌธ์๋ฅผ ์ง์ ์ฌ์ฉํ ์๋ ์๋ค.
for (let i = 0, chr; i < str.length; i++) {
[chr, i] = getWholeCharAndI(str, i);
// ์ ์ฒด ๋ฌธ์์ด๊ณผ ํ์ฌ current iterationd์ ์ ๋ฌํ๊ณ
// ๊ฐ๋ณ ๋ฌธ์์ i๊ฐ์ ๊ฐ์ง Array๋ฅผ ๋ฐํํ๋ค.(surrogate pair ์๋ ๊ฒฝ์ฐ์๋ง ๋ณ๊ฒฝ๋๋ค.)
console.log(chr);
}
function getWholeCharAndI(str, i) {
let code = str.charCodeAt(i);
if(Number.isNaN(code)) {
return ''; // ์์น๋ฅผ ์ฐพ์ ์ ์์
}
if(code < 0xD800 || code > 0xDFFF) {
return [str.charAt(i), i]; // Normal character, 'i'๋ ๊ทธ๋๋ก ์ ์ง
}
// High surrogate
// high private surrogates๋ฅผ ๋จ์ผ ๋ฌธ์๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ง์ง๋ง 16์ง์๋ฅผ 0xDB7F๋ก ๋ณ๊ฒฝํ ์ ์์
if(0xD800 <= code && code <= 0xDBFF) {
// 16๋นํธ ์ฝ๋ ๋๊ฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ํ๋๋ฅผ ํํํ ๊ฒ์ surrogate pair๋ผ๊ณ ํ๋ฉฐ high surrogate, low surrogate๋ก ์ด๋ฃจ์ด์ง
// low surrogate๊ฐ ์๋ ๊ฒฝ์ฐ
if(str.length <= (i + 1)) {
throw 'High surrogate without following low surrogate';
}
let next = str.charCodeAt(i + 1);
if(0xDC00 > next || next > 0xDFFF) {
throw 'High surrogate without following low surrogate';
}
return [str.charAt(i) + str.charAt(i + 1), i + 1];
}
// Low surrogate (0xDC00 <= code && code <= 0xDFFF)
if(i === 0) {
throw 'Low surrogate without preceding high surrogate';
}
let prev = str.charCodeAt(i - 1);
// high private surrogates๋ฅผ ๋จ์ผ ๋ฌธ์๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ง์ง๋ง 16์ง์๋ฅผ 0xDB7F๋ก ๋ณ๊ฒฝํ ์ ์์
if(0xD800 > prev || prev > 0xDBFF) {
throw 'Low surrogate without preceding high surrogate';
}
// ๋์ ๋ค์ ๋ฌธ์ ๋ฐํ(๋ฐ ์ฆ๊ฐ)
return [str.charAt(i + 1), i + 1];
}
non-Basic-Multilingual-Plane ๋ฌธ์๋ค์ ์ง์ํ๋๋ก charAt()
๊ณ ์น๊ธฐ
non-BMP ๋ฌธ์๋ค์ ์ง์ํ๋ ์๋ ๐ ์ ์์ ๋ค์ด ๋ ์์ฃผ ์ฌ์ฉ๋์ง๋ง, ์ธ๋ฑ์ค๋ก ๋ฌธ์๋ฅผ ์ ํํ๋๋ฐ ์์ด์ ๋ฌธ์์ด ๋ด์ Surrogate Pair๊ฐ ํ๋์ ๋ฌธ์์ด๋ก ์ฒ๋ฆฌ๋๊ธธ ์ํ๋ค๋ฉด! ๐
Copy let str = 'A\uD87E\uDC04Z';
console.log(fixedCharAt(str,1));
function fixedCharAt(str, idx) {
let ret = '';
str += '';
let end = str.length;
let surrogatePairs = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
while ((surrogatePairs.exec(str) != null)) {
let li = surrogatePairs.lastIndex;
if (li - 2 < idx) {
idx ++
} else {
break;
}
}
if(idx >= end || idx < 0) return '';
ret += str.charAt(idx);
if(/[\uD800-\uDBFF]/.test(ret) && /[\uDC00-\uDFFF]/.test(str.charAt(idx + 1))) {
ret += str.charAt(idx + 1);
}
return ret;
}