๋ฐ˜์‘ํ˜•

์œ ๋‹ˆ์ฝ”๋“œ


๐Ÿ’ก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด์„ 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']

 

 

๋ ˆํผ๋Ÿฐ์Šค


 

์œ ๋‹ˆ์ฝ”๋“œ: 'u' ํ”Œ๋ž˜๊ทธ์™€ \p{...} ํด๋ž˜์Šค

 

ko.javascript.info

 


๊ธ€ ์ˆ˜์ •์‚ฌํ•ญ์€ ๋…ธ์…˜ ํŽ˜์ด์ง€์— ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”
๋ฐ˜์‘ํ˜•