๋งŒ์กฑ

[Javascript] ์จ๋กœ๊ฒŒ์ดํŠธ ํŽ˜์–ด(surrogate pair) ๋ณธ๋ฌธ

[Javascript] ์จ๋กœ๊ฒŒ์ดํŠธ ํŽ˜์–ด(surrogate pair)

FrontEnd/Web Satisfaction 2024. 6. 9. 20:29

const str= '๐Ÿ˜…';
console.log(str.length);

 

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฝ˜์†”์—๋Š” ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋ ๊นŒ?

 

'1๊ธ€์ž๋‹ˆ๊นŒ 1์ด๊ฒ ์ง€' ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ 2๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

 

 

์™œ ์ด๋ ‡๊ฒŒ ํ‘œ์‹œ๋˜๋Š”์ง€ ์•Œ์•„๋ณด์ž

 

์จ๋กœ๊ฒŒ์ดํŠธ ํŽ˜์–ด (surrogate pair)

 

๊ธฐ๋ณธ์ ์œผ๋กœ js์—์„œ string์€ UTF-16์œผ๋กœ ๋‹ค๋ค„์ง„๋‹ค.

 

UTF-16์€ ๋ฌธ์ž๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ 2๋ฐ”์ดํŠธ ๋˜๋Š” 4๋ฐ”์ดํŠธ๋ฅผ ๊ฐ€๋ณ€์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

 

ํ•œ๊ตญ์–ด ๋ฌธ์ž(๊ฐ€, ๋‚˜, ๋‹ค...)๋Š” 2๋ฐ”์ดํŠธ๋กœ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ

์ผ๋ถ€ ํ•œ์ž๋‚˜ ์ด๋ชจ์ง€ ๋“ฑ์€ 2๋ฐ”์ดํŠธ๋กœ ํ‘œํ˜„์ด ๋ถˆ๊ฐ€๋Šฅํ•ด 2๋ฐ”์ดํŠธ๋ฅผ ๋” ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค,

 

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” 2๋ฐ”์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋˜, 

2๋ฐ”์ดํŠธ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„ ๋ฐ”๊นฅ์˜ ๋ฌธ์ž์—ด๋“ค์€ 2๋ฐ”์ดํŠธ๋ฅผ ๋” ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•œ๋‹ค.

 

๋‘ ๊ธ€์ž๋งŒํผ์˜ ๊ณต๊ฐ„์„ ํ•œ ๊ธ€์ž๋ฅผ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ด๊ฒƒ์„ ์จ๋กœ๊ฒŒ์ดํŠธ ํŽ˜์–ด(surrogate pair)๋ผ๊ณ  ํ•œ๋‹ค.

 

const str= '๐Ÿ˜…'; //์จ๋กœ๊ฒŒ์ดํŠธ ํŽ˜์–ด๋Š” 4๋ฐ”์ดํŠธ(๊ธฐ๋ณธ ํฌ๊ธฐ์˜ 2๋ฐฐ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž๋ฅผ ํ‘œํ˜„ํ•˜๋ฏ€๋กœ
console.log(str.length); //1๊ธ€์ž์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ length๋Š” 2๊ฐ€ ๋œ๋‹ค

 

 

์จ๋กœ๊ฒŒ์ดํŠธ ํŽ˜์–ด ๋‹ค๋ฃจ๊ธฐ

ํ•œ ๊ธ€์ž์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ ๊ธธ์ด๋Š” 2๊ธฐ ๋•Œ๋ฌธ์— ์จ๋กœ๊ฒŒ์ดํŠธ ํŽ˜์–ด๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃฐ ๋•Œ์—๋Š” ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.

 

const str= '๐Ÿ˜…๊ฐ€๋‚˜๋‹ค';

for(let i=0; i< str.length; i++){
  console.log(str[i]);
}

 

์œ„์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฌธ์ž์—ด ๋‚ด๋ถ€๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด ์จ๋กœ๊ฒŒ์ดํŠธ ํŽ˜์–ด๋ฅผ ๊ณ ๋ คํ•ด์ฃผ์ง€ ๋ชปํ•ด

๊ธฐ๋ณธ ํฌ๊ธฐ์ธ 2๋ฐ”์ดํŠธ๋กœ ๋ฌธ์ž๊ฐ€ ์ž˜๋ฆฌ๊ฒŒ ๋œ๋‹ค.

 

 

 

๐Ÿ˜…๋Š” 4๋ฐ”์ดํŠธ, ์ฆ‰ 2๊ธ€์ž ๋งŒํผ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ 

๋ฐ”์ดํŠธ๊ฐ€ ์ ˆ๋ฐ˜์”ฉ ์ž˜๋ ค๋‚˜๊ฐ€ console.log์— ๋“ค์–ด๊ฐ„๋‹ค.

 

์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฌธ์ž์—ด ๋‚ด๋ถ€๋ฅผ ๋ฐ˜๋ณตํ•˜๋ ค๋ฉด ์ผ๋ฐ˜ for ๋Œ€์‹  for-of๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

 

const str= '๐Ÿ˜…๊ฐ€๋‚˜๋‹ค';

for(const char of str){
  console.log(char);
}

 

 

 

์ด์™ธ์˜ String ๋ฉ”์„œ๋“œ์—์„œ index๋ฅผ ์ด์šฉํ•ด ๋‹ค๋ฃจ๋Š” ํ•จ์ˆ˜์—์„œ๋„ ์จ๋กœ๊ฒŒ์ดํŠธ ํŽ˜์–ด๋Š” ๊ณ ๋ ค๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

 

๋‹จ๋… ์จ๋กœ๊ฒŒ์ดํŠธ

 

String.prototype.isWellFormed()๋กœ ํ˜„์žฌ string์ด ์ •์ƒ์ ์ธ ๋ฐ”์ดํŠธ ํŒจํ„ด์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฌธ์ž์ธ์ง€ ํŒ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/isWellFormed

 

String.prototype.isWellFormed() - JavaScript | MDN

The isWellFormed() method of String values returns a boolean indicating whether this string contains any lone surrogates.

developer.mozilla.org

const str= '๐Ÿ˜…๊ฐ€๋‚˜๋‹ค';

for(let i=0; i< str.length; i++){
  if(!str[i].isWellFormed()){
    console.error('this string is not wellFormed');
  }
  console.log(str[i]);
}

 

 

isWellFormed() ๊ฐ€ false๋ผ๋ฉด ์จ๋กœ๊ฒŒ์ดํŠธ ํŽ˜์–ด๊ฐ€ ๊นจ์กŒ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

2๊ธ€์ž๋งŒํผ์˜ ๊ณต๊ฐ„์ด 1๊ธ€์ž๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์–ด์•ผ ํ•˜์ง€๋งŒ 1๊ธ€์ž๋ถ„์˜ ๋ฐ”์ดํŠธ(lone surrogate)๋งŒ ํฌํ•จ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 



Comments