[JS] ์ ๋์ฝ๋์ ์ ๋์ฝ๋ ํ๋กํผํฐ
์ ๋์ฝ๋
๐ก ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ชจ๋ ๋ฌธ์์ด์ UTF-16์ผ๋ก ์ธ์ฝ๋ฉํ๋ค. UTF-16์ ๊ธฐ๋ณธ์ ์ผ๋ก 2๋ฐ์ดํธ(16๋นํธ)๋ก ์ธ์ฝ๋ฉํ์ง๋ง, 2๋ฐ์ดํธ๋ก ํํํ ์ ์๋ ์ด๋ชจ์ง, ํน์ ๊ธฐํธ ๊ฐ์ ๋ฌธ์๋ ์๋ก๊ฒ์ดํธ ํ์ด๋ฅผ ํตํด 4๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ฅผ ๋ณด์ถฉ ๋ฌธ์๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์๋ก๊ฒ์ดํธ ํ์ด๋ U+10000
(65536) ์ด์์ ์ฝ๋ ํฌ์ธํธ๋ฅผ ํํํ๊ธฐ ์ํด ๋ ๊ฐ์ 2๋ฐ์ดํธ ์ฝ๋ ์กฐํฉ์ผ๋ก ๋ณด์ถฉ ๋ฌธ์๋ฅผ ํํํ๋ ๋ฐฉ์์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ ๋์ฝ๋๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์์ด์ ์ธ์ฝ๋ฉํ๋ค. ์ ๋์ฝ๋๋ ์ ์ธ๊ณ์ ๋ค์ํ ๋ฌธ์์ ๊ธฐํธ๋ฅผ ํํํ ์ ์๋๋ก ์ค๊ณ๋ ๊ตญ์ ํ์ค์ด๋ค. ์ ๋์ฝ๋์์ ๊ฐ ๋ฌธ์๋ ๊ณ ์ ํ ์ฝ๋ ํฌ์ธํธ(ํด๋น ๋ฌธ์์ด์ ๋ํํ๋ ์ซ์)๋ฅผ ๊ฐ์ง๋ค.
์ฝ๋ ํฌ์ธํธ๋ U+
์ ๋์ฌ์ 16์ง์ ์ซ์๋ฅผ ํฉ์น ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค. ์๋ฅผ๋ค์ด ์ํ๋ฒณ a
์ ์ฝ๋ํฌ์ธํธ๋ U+0061
์ด๋ค. ์ฌ๊ธฐ์ 16์ง์ 61
์ 10์ง์๋ก ํ๊ธฐํ๋ฉด 97
์ด๊ณ , ์ด๋ charCodeAt
codePointAt
๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ๊ณผ ๋์ผํ๋ค.
'a'.charCodeAt(); // 97
'a'.codePointAt(); // 97
์ ๋์ฝ๋ U+D800
(55296)๋ถํฐ U+DFFF
(57343) ๊น์ง์ ์ฝ๋๋ ๋จ๋
์ผ๋ก๋ ์์ ํ ๋ฌธ์๋ฅผ ๋ํ๋ผ ์ ์๋ค. ์ด ๋ฒ์์ ์ํ๋ ์ฝ๋๋ค์ ์๋ก๊ฒ์ดํธ ํ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ, 4๋ฐ์ดํธ๋ก ์ธ์ฝ๋ฉ๋ ๋ฌธ์๋ฅผ ํํํ ๋ ์ฌ์ฉ๋๋ค. ์ด๋ชจ์ง, ํน์ ๊ธฐํธ, ๋ค์ํ ๊ตญ์ ๋ฌธ์ ๋ฑ์ด ์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
charCodeAt
๋ฉ์๋๋ ์ง์ ํ ๋ฌธ์์ UTF-16 ์ฝ๋ ์ ๋์ ๋ฐํํ๋ค. ๋ง์ฝ ํด๋น ๋ฌธ์๊ฐ ์๋ก๊ฒ์ดํธ ํ์ด๋ฅผ ์ด๋ฃจ๊ณ ์๋ค๋ฉด charCodeAt
๋ฉ์๋๋ ์ฒซ ๋ฒ์งธ ์ฝ๋ ์ ๋๋ง ๋ฐํํ๋ค. ๋ฐ๋ฉด, codePointAt
๋ฉ์๋๋ ์๋ก๊ฒ์ดํธ ํ์ด๋ฅผ ๊ตฌ์ฑํ๋ ๋ ์ฝ๋ ์ ๋์ ๊ฒฐํฉํ์ฌ ์ ์ฒด ์ ๋์ฝ๋ ํฌ์ธํธ๋ฅผ ๋ฐํํ๋ค. ๋๋ฌธ์ ์ด๋ชจ์ง์ฒ๋ผ ์๋ก๊ฒ์ดํธ ํ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ์์ ์ ์ฒด ์ฝ๋ ํฌ์ธํธ๋ฅผ ์ป์ผ๋ ค๋ฉด codePointAt
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
const emoji = "๐"; // ์๋ก๊ฒ์ดํธ ํ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ์
console.log(emoji.length); // 2 (4๋ฐ์ดํธ๋ก ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ฌ์ length 2)
const firstUnit = emoji.charCodeAt(0); // 55357 (์ฒซ๋ฒ์งธ ์ฝ๋ ์ ๋)
const secondUnit = emoji.charCodeAt(1); // 56898 (๋๋ฒ์งธ ์ฝ๋ ์ ๋)
const fullCodePoint = emoji.codePointAt(0); // 128578 (์ ์ฒด ์ฝ๋ ์ ๋)
charCodeAt(index)
: UTF-16 ์ฝ๋ ์ ๋์ ๋ํ๋ด๋ 0~65535 ์ฌ์ด์ 10์ง์ ์ ์ ๋ฐํcodePointAt(index)
: ์ ์ฒด ์ ๋์ฝ๋ ์ฝ๋ ํฌ์ธํธ๋ฅผ 10์ง์๋ก ๋ฐํ
์ ๋์ฝ๋ ํ๋กํผํฐ
์ ๋์ฝ๋์ ๋ชจ๋ ๋ฌธ์๋ ๋ค์ํ ํ๋กํผํฐ(์์ฑ)๋ฅผ ๊ฐ์ง๋๋ฐ, ์ด ํ๋กํผํฐ๋ฅผ ํตํด ํด๋น ๋ฌธ์๊ฐ ์ด๋ค ๋ฒ์ฃผ์ ์ํ๋์ง ๋ฑ์ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋ค. ์๋ฅผ๋ค์ด Letter
ํ๋กํผํฐ๋ ํน์ ์ธ์ด์ ๋ฌธ์์์ ๋ํ๋ด๊ณ Number
ํ๋กํผํฐ๋ ์ซ์์์ ๋ํ๋ธ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ์ ๊ท์์ \p{...}
์ ๋์ฝ๋ ์์ฑ ์ด์ค์ผ์ดํ ๋ฌธ๋ฒ์ ์ฌ์ฉํด์ ์ ๋์ฝ๋ ์์ฑ์ ์๋ณํ ์ ์๋ค. ์ด๋ u
ํ๋๊ทธ๋ฅผ ๋ถ์ฌ์ ์ ๋์ฝ๋ ๋ชจ๋๋ฅผ ํ์ฑํํด์ผ ํ๋ค.
const num = "10";
num.match(/\p{Number}/u); // ['1', index: 0, input: '10', groups: undefined]
num.match(/\p{Letter}/u); // null
์ฃผ์ ํ๋กํผํฐ ๋ชฉ๋ก์ ์๋์ ๊ฐ๋ค. ๋ชจ๋ ์ข
๋ฅ์ ๋ฌธ์๋ฅผ ์ฐพ์ ๋ L
ํน์ Letter
, ์๋ฌธ์๋ฅผ ์ฐพ์ ๋ Ll
ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ์๋ ์ ๋์ฝ๋ ํ๋กํผํฐ๋ฅผ ํ์ฉํด์ ํน์ ์ธ์ด์ ๋จ์ด๋, ํตํ ๋จ์ ๊ฐ์ ํน์ ๋ฌธ์๋ฅผ ์ฝ๊ฒ ๊ฒ์ํ ์ ์๋ค.
๋๋ถ๋ฅ | ์๋ถ๋ฅ | ์ถ์ฝ ํ๋กํผํฐ |
๋ฌธ์(Letter) L |
์๋ฌธ์(lowercase) | Ll |
์กฐ์ (modifier) | Lm |
|
๋จ์ด์ ์ฒซ ๊ธ์๋ฅผ ๋๋ฌธ์๋ก(titlecase) | Lt |
|
๋๋ฌธ์(uppercase) | Lu |
|
๊ธฐํ(other) | Lo |
|
์ซ์(Number) N |
10์ง์(decimal digit) | Nd |
๋ฌธ์(letter number) | Nl |
|
๊ธฐํ(other) | No |
|
๋ฌธ์ฅ ๋ถํธ(Punctuation) P |
์ฐ๊ฒฐ์ (connector) | Pc |
๋์(dash) | Pd |
|
์ฒ์ ๋ฐ์ดํ(initial quote) | Pi |
|
๋ง์ง๋ง ๋ฐ์ดํ(final quote) | Pf |
|
์ด๊ธฐ(open) | Ps |
|
๋ซ๊ธฐ(close) | Pe |
|
๊ธฐํ(other) | Po |
|
ํ์(Mark) M |
๊ฐ๊ฒฉ ๊ฒฐํฉ(spacing combining) | Mc |
๋ฌถ์(enclosing) | Me |
|
๋น๊ณต๋ฐฑ(non-spacing) | Mn |
|
๊ธฐํธ(Symbol) S |
ํตํ(currency) | Sc |
์์ (modifier) | Sk |
|
์ํ(math) | Sm |
|
๊ธฐํ(other) | So |
|
๊ตฌ๋ถ ๊ธฐํธ(Separator) Z |
์ค(line) | Zl |
๋จ๋ฝ(paragraph) | Zp |
|
๊ณต๋ฐฑ(space) | Zs |
|
๊ธฐํ(Other) C |
์ ์ด(control) | Cc |
ํ์(format) | Cf |
|
ํ ๋น๋์ง ์์(not assigned) | Cn |
|
์ฌ์ฉ์ ์ง์ (private use) | Co |
|
์๋ก๊ฒ์ดํธ(surrogate) | Cs |
์ ๋ชฉ๋ก ์ธ์๋ ํ์๋ ํ๋กํผํฐ๋ ์๋ค. ์ ๋์ฝ๋๋ ๋งค์ฐ ๋ค์ํ ํ๋กํผํฐ๋ฅผ ์ง์ํ๋๋ฐ ๋งํฌ์์ ๋ฌธ์๋ณ ํ๋กํผํฐ ๋ชฉ๋ก, ํ๋กํผํฐ๋ณ ๋ฌธ์ ๋ชฉ๋ก ๋ฑ์ ํ์ธํ ์ ์๋ค.
Alphabetic
(Alpha
) : ๋ชจ๋ ์ธ์ด์ ์ํ๋ฒณ e.g.A-Z
,a-z
,๊ฐ๋๋ค
Other_Alphabetic
(OAlpha
) : ์ํ๋ฒณ์ผ๋ก ๊ฐ์ฃผ๋๋ ํน์ ๋ฌธ์ e.g.โ ซ
(๋ก๋ง์ซ์ 12)Hex_Digit
: 16์ง์ ์ซ์ e.g.0-9
,a-f
(ํน์A-F
)Emoji_Presentation
: ์ด๋ชจ์ง ๋ฌธ์
์์
ํ๊ธ ๊ฒ์ โญ
Script
์ ๋์ฝ๋ ํ๋กํผํฐ๋ ํน์ ๋ฌธ์ ์ฒด๊ณ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์๋ณํ ๋ ์ฌ์ฉํ๋ค. Script
ํ๋กํผํฐ๋ฅผ ์ด์ฉํด ๋ผํด ๋ฌธ์, ํ์, ํ๊ธ ๋ฑ์ ์๋ณํ๊ณ ํํฐ๋งํ ์ ์๋ค. ๊ตฌ๋ฌธ์ ์๋์ ๊ฐ๋ค.
Script=value ํน์ sc=value
value
์ ์ํ๋ ์คํฌ๋ฆฝํธ ์ด๋ฆ์ ์
๋ ฅํ๋ค. ์๋ฅผ๋ค์ด ํ๊ธ ๋ฌธ์๋ฅผ ๊ฒ์ํ๋ ค๋ฉด \p{sc=Hangul}
ํํ๋ก ์์ฑํ๋ค. ์ ์ฒด Script
๋ชฉ๋ก์ ๋งํฌ์์ ํ์ธํ ์ ์๋ค. ์ฐธ๊ณ ๋ก Script
๊ฐ์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ฏ๋ก ์ฃผ์ํ์.
const str = "a๊ฐb๋cไฝ dๅฅฝ";
// ํ๊ธ ๋ฌธ์ ๊ฒ์
str.match(/\p{sc=Hangul}/gu); // ['๊ฐ', '๋']
// ํ์ ๋ฌธ์ ๊ฒ์
str.match(/\p{sc=Han}/gu); // ['ไฝ ', 'ๅฅฝ']
// ๋ผํด ๋ฌธ์ ๊ฒ์
str.match(/\p{sc=Latin}/gu); // ['a', 'b', 'c', 'd']
ํตํ ๊ฒ์
Currency_Symbol
ํน์ Sc
(์ถ์ฝํ) ์ ๋์ฝ๋ ํ๋กํผํฐ๋ก ํตํ ๋จ์๋ฅผ ๋ํ๋ด๋ ๋ฌธ์๋ฅผ ์ฐพ์ ์ ์๋ค. ์๋๋ ํตํ ๋จ์
์ซ์
ํํ์ ๊ฐ๊ฒฉ ํ์๋ฅผ ์ฐพ๋ ์ ๊ท์ ์์.
const str = "Prices: $8, €9, ¥98";
str.match(/\p{Sc}\d+/gu); // ['$8', '€9', '¥98']
๐ +
์๋์๋ 1๋ฒ ์ด์ ๋ฐ๋ณต๋๋ ๊ฒฝ์ฐ ์ผ์นํ๋ค๊ณ ํ๋จํ๊ณ , \d
๋ ์ซ์ 0์์ 9๊น์ง์ ๋ฌธ์ ๊ทธ๋ฃน์ ๊ฐ๋ฆฌํค๋ ๋จ์ถ์ด๋ค. ์ด์ ๋ฐ๋์ธ \D
๋ ์ซ์๊ฐ ์๋ ๋ฌธ์๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
16์ง์ ๊ฒ์
Hex_Digit
์ ๋์ฝ๋ ํ๋กํผํฐ๋ฅผ ์ด์ฉํด 0-9
, a-f
ํน์ A-F
๋ฒ์์ ์ํ๋ 16์ง์ ๋ฌธ์๋ฅผ ์ฐพ์ ์ ์๋ค. ์๋๋ 0x
๋ค์ 1๊ฐ ์ด์์ 16์ง์ ๋ฌธ์๋ฅผ ์ฐพ๋ ์์.
const userInput = "Error at 0x7fe3: invalid input";
userInput.match(/0x\p{Hex_Digit}+/gu); // ['0x7fe3']
๋ ํผ๋ฐ์ค
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[JS] Array.fill() ๋ฉ์๋ ์ฌ์ฉ ์ ์ฃผ์ํ ์
[JS] Array.fill() ๋ฉ์๋ ์ฌ์ฉ ์ ์ฃผ์ํ ์
2024.05.30 -
[JS] Bitwise ๋นํธ ์ฐ์ฐ์ ํบ์๋ณด๊ธฐ (feat. ๋นํธ๋ง์คํฌ)
[JS] Bitwise ๋นํธ ์ฐ์ฐ์ ํบ์๋ณด๊ธฐ (feat. ๋นํธ๋ง์คํฌ)
2024.05.29 -
[TS] ํ์ ์คํฌ๋ฆฝํธ ํด๋์ค(class) ๋ฌธ๋ฒ, ์ถ์ ํด๋์ค์ ๋ฉ์๋
[TS] ํ์ ์คํฌ๋ฆฝํธ ํด๋์ค(class) ๋ฌธ๋ฒ, ์ถ์ ํด๋์ค์ ๋ฉ์๋
2024.05.29 -
[DevTools] ์น์์ VSCode ์ฌ์ฉํ๊ธฐ - github.dev / github1s
[DevTools] ์น์์ VSCode ์ฌ์ฉํ๊ธฐ - github.dev / github1s
2024.05.29