Skip to content

Commit

Permalink
πŸš€ [TIL] 2024-01-07
Browse files Browse the repository at this point in the history
  • Loading branch information
padosum committed Jan 7, 2024
1 parent 227c0bc commit a2005d4
Show file tree
Hide file tree
Showing 15 changed files with 225 additions and 2 deletions.
Binary file added wiki/Attachments/bing-autocomplete-bear.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added wiki/Attachments/bing-autocomplete-polarbear.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added wiki/Attachments/coupang-autocomplete-bear.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added wiki/Attachments/deepl-polarbear.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added wiki/Attachments/dog-emoji-symblcc.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added wiki/Attachments/dragon-emoji.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added wiki/Attachments/editor.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added wiki/Attachments/google-autocomplete.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added wiki/Attachments/mac-font-book.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added wiki/Attachments/naver-polarbear.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion wiki/Drawing-Pixel-Art-in-Web.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: μ›Ήμ—μ„œ ν”½μ…€ μ•„νŠΈ λ§Œλ“€κΈ°
date: 2023-12-03 23:57:35 +0900
updated: 2023-12-10 20:28:24 +0900
aliases: ['μ›Ήμ—μ„œ ν”½μ…€ μ•„νŠΈ λ§Œλ“€κΈ°']
tags: ['How to']
tags: ['How to', 'κΈ€λ˜']
---

![e-boy](https://cdn0.vox-cdn.com/assets/4604041/eboy_section_3_1.gif)
Expand Down
222 changes: 222 additions & 0 deletions wiki/Various-Aspects-of-Emoji.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
---
title: 이λͺ¨μ§€μ˜ 이λͺ¨μ €λͺ¨
date: 2024-01-06 10:32:51 +0900
updated: 2024-01-07 23:04:46 +0900
aliases: ['이λͺ¨μ§€μ˜ 이λͺ¨μ €λͺ¨']
tags: ['κΈ€λ˜']
draft: false
---

웹에 μ ‘μ†ν•˜λŠ” 맀일, 이λͺ¨μ§€(Emoji)λ₯Ό 보지 μ•ŠλŠ” 날이 μ—†λ‹€. 그만큼 이λͺ¨μ§€λŠ” μƒν™œμ— κΉŠμˆ™μ΄ λ“€μ–΄μ™”λ‹€.
이λͺ¨μ§€λŠ” λ‹€λ₯Έ λ¬Έμžμ™€ 뭐가 λ‹€λ₯Έ 걸까? μ–΄λ–»κ²Œ ν‘œμ‹œλ˜λŠ” 걸까? 이λͺ¨μ§€μ— λŒ€ν•΄ 생긴 κΆκΈˆμ¦μ„ ν•΄κ²°ν•΄ 보고자 ν•œλ‹€.

## 이λͺ¨μ§€

![NTT DOCOMO Emoji](https://blog.emojipedia.org/content/images/2019/03/emojipedia-softbank-docomo-apple-1997-1999-2018.jpg)

이λͺ¨μ§€λŠ” 감정, 기호 λ˜λŠ” 사물을 λ‚˜νƒ€λ‚΄λŠ” 데 μ‚¬μš©λ˜λŠ” κ·Έλ¦Ό λ¬Έμžλ‹€. μ›λž˜λŠ” 일본 νœ΄λŒ€ν°μ—μ„œ μ‚¬μš©ν–ˆμ§€λ§Œ μ§€κΈˆμ€ μ „ μ„Έκ³„μ μœΌλ‘œ μ‚¬μš©λœλ‹€. "이λͺ¨μ§€"λž€ 이름은 일본어 η΅΅ζ–‡ε­—(emoji)μ—μ„œ μ™”λ‹€. η΅΅(에)λŠ” 그림을, ζ–‡ε­—(λͺ¨μ§€)λŠ” 문자λ₯Ό μ˜λ―Έν•œλ‹€.

### 이λͺ¨ν‹°μ½˜ ?

μ˜ˆμ „λΆ€ν„° 감정을 λ‚˜νƒ€λ‚΄λŠ” 문자λ₯Ό "이λͺ¨ν‹°μ½˜"이라 λΆˆλ €λŠ”λ°, μŠ€λ§ˆνŠΈν°μ„ μ‚¬μš©ν–ˆμ„ λ•Œμ―€ "이λͺ¨μ§€"λž€ 단어가 뢈μ‘₯ λ‚˜νƒ€λ‚¬λ‹€. 2가지가 무슨 차이가 μžˆλŠ”μ§€ κΆκΈˆν–ˆλ‹€.
이λͺ¨ν‹°μ½˜μ€ "emotion" + "icon"으둜 이메일과 문자 λ©”μ‹œμ§€μ—μ„œ 감정을 μ „λ‹¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν–ˆλ‹€. 예λ₯Ό λ“€λ©΄ `:-)`, `:-(`와 같은 것듀이닀. 이λͺ¨μ§€λŠ” μ΄λ¦„μ—μ„œ μ•Œ 수 μžˆλ“―μ΄ 감정뿐 μ•„λ‹ˆλΌ λ‹€λ₯Έ κΈ°ν˜Έλ‚˜ 사물듀을 ν‘œν˜„ν•˜λŠ” "κ·Έλ¦Ό 문자"인 것이닀. 근데 보톡 이 말도 μ“°κ³  μ € 말도 μ“°λŠ” 것 κ°™μ•„ 보인닀.

## μœ λ‹ˆμ½”λ“œμ™€ UTF

μ»΄ν“¨ν„°μ—μ„œ λ°μ΄ν„°λŠ” `0`κ³Ό `1`둜 ν‘œν˜„λœλ‹€. 문자λ₯Ό `0`κ³Ό `1`둜 μ €μž₯ν•˜λŠ” 것을 **"문자 인코딩"** 이라 ν•œλ‹€. 그럼 μ–΄λ–€ λ°μ΄ν„°λŠ” μ™œ 일반 문자둜 ν‘œμ‹œλ˜κ³  이λͺ¨μ§€λŠ” 그림이 λ‚˜νƒ€λ‚˜λŠ” 걸까? μš°μ„  μ»΄ν“¨ν„°μ—μ„œ 문자λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μ–΄λ–€ 방법을 μ‚¬μš©ν•˜λŠ”μ§€ μ•Œμ•„λ³΄μž!

![teleprinter](https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Fernschreiber_T100_Siemens.jpg/640px-Fernschreiber_T100_Siemens.jpg)

1960λ…„λŒ€μ— "Teleprinter"λΌλŠ” κΈ°κΈ°κ°€ μžˆμ—ˆλ‹€κ³  ν•œλ‹€. μ–΄λ¦° μ‹œμ ˆμ— νƒ€μžκΈ°λ₯Ό λ³Έ 적이 μžˆμ—ˆλŠ”λ° 그와 λΉ„μŠ·ν•˜κ²Œ 생겼닀.
TeleprinterλŠ” 전보λ₯Ό λΆ€μΉ˜κΈ° μœ„ν•΄ 글을 μž…λ ₯ν•΄μ„œ κ·Έκ±Έ μ „κΈ° μ‹ ν˜Έλ‘œ λ°”κΎΌ λ’€, λ°›λŠ” μͺ½μ—μ„œ 좜λ ₯ν•˜λŠ” 기계닀.
λ¬Έμžκ°€ μ „κΈ° μ‹ ν˜Έλ‘œ λ³€ν™˜λ˜κΈ° μœ„ν•΄ 숫자둜 λ³€ν™˜μ΄ 될 텐데 이 숫자λ₯Ό λ³΄λ‚΄λŠ” 방법에 ν‘œμ€€μ΄ ν•„μš”ν•΄μ„œ λ―Έκ΅­μ—μ„œ **ASCII**λΌλŠ” ν‘œμ€€μ„ λ§Œλ“€μ—ˆλ‹€. ν‘œμ€€μ΄ ν•„μš”ν•œ μ΄μœ λŠ” μ–΄λ–€ 숫자λ₯Ό 보내면 λ°›λŠ” μͺ½μ—μ„  이게 μ–΄λ–€ 문자λ₯Ό μ˜λ―Έν•˜λŠ”μ§€ νŒλ‹¨ν•˜λŠ” 기쀀이 되기 λ•Œλ¬Έμ΄λ‹€.

ASCIIλŠ” 7개의 bitλ₯Ό μ‚¬μš©ν•œλ‹€. ν‚€λ³΄λ“œλ‘œ μΉ˜λŠ” 각 κΈ€μžκ°€ 7bit μ΄μ§„μˆ˜λ‘œ λ³€κ²½λΌμ„œ 전선을 타고 μƒλŒ€λ°©μ—κ²Œ μ „μ†‘λœλ‹€. 7bit이기 λ•Œλ¬Έμ— μ‚¬μš©ν•  수 μžˆλŠ” μˆ«μžλŠ” `0`μ—μ„œ `127`이닀.

![ASCII|https://www.vlsifacts.com/ascii-code/](http://www.vlsifacts.com/wp-content/uploads/2023/02/ASCII-Code.png)

μœ„ ASCII μ½”λ“œν‘œλ₯Ό ν™•μΈν•˜λ©΄ μ•Œ 수 μžˆλ“―μ΄ 처음 32개 μˆ«μžλŠ” μ€„λ°”κΏˆ 문자, 백슀페이슀 등을 λ°°λ‹Ήν•˜κ³  κ·Έ λ’€λ‘œ 특수 λ¬Έμžλ“€κ³Ό 숫자λ₯Ό, `65`λΆ€ν„° μ•ŒνŒŒλ²³μ΄ λ“€μ–΄κ°„λ‹€.
μ—¬κΈ°μ„œ ν•˜λ‚˜μ˜ νŠΉμ§•μ€ `A`λŠ” `65`λΌλŠ” μˆ«μžμ— λ°°λ‹Ήν–ˆκΈ° λ•Œλ¬Έμ— μ΄μ§„μˆ˜λ₯Ό 봀을 λ•Œ λ§ˆμ§€λ§‰ 숫자 2개만 ν™•μΈν•΄μ„œ λͺ‡ 번째 μ•ŒνŒŒλ²³μΈμ§€ 확인할 수 μžˆμ—ˆλ‹€λŠ” 점이닀.

```
1000001 // A
1000010 // B
1000011 // C
1100001 // a
1100010 // b
1100011 // c
```

μ˜μ–΄κΆŒ κ΅­κ°€μ—μ„œλŠ” μ•ŒνŒŒλ²³μ„ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— ν‘œμ€€μœΌλ‘œ μ •μ°©λ˜μ—ˆμ§€λ§Œ μ•ŒνŒŒλ²³μ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 언어듀을 λ§Œλ‚˜ λ¬Έμ œκ°€ 생겨났닀. κ·Έλž˜μ„œ ν•΄λ‹Ή 언어듀은 각자의 인코딩 방식을 μ‚¬μš©ν–ˆλ‹€. 예λ₯Ό λ“€μ–΄ ν•œκΈ€μ€ EUC-KR 인코딩 방식을 μ‚¬μš©ν–ˆλ‹€.

그리고 μ‹œκ°„μ€ 흘러 **World Wide Web**이 λ“±μž₯ν–ˆκ³ , λ‹€μ–‘ν•œ λ¬Έμžκ°€ ν¬ν•¨λœ λ¬Έμ„œλ“€μ΄ μ „ 세계 κ³³κ³³μ—μ„œ μ „μ†‘λ˜κΈ° μ‹œμž‘ν–ˆλ‹€! μ§„μ •ν•œ ν‘œμ€€μ΄ ν•„μš”ν•œ μ‹œκΈ°κ°€ μ°Ύμ•„μ˜¨ 것이닀.
μ΄λ•Œ **μœ λ‹ˆμ½”λ“œ**λΌλŠ” 것이 λ‚˜μ™”λ‹€. μœ λ‹ˆμ½”λ“œλŠ” μœ λ‹ˆμ½”λ“œ μ»¨μ†Œμ‹œμ—„μ΄λΌλŠ” λΉ„μ˜λ¦¬ λ‹¨μ²΄μ—μ„œ κ΄€λ¦¬ν•˜λŠ”λ° μ „ 세계 λͺ¨λ“  문자λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•΄μ„œ 각 λ¬Έμžμ— κ³ μœ ν•œ μ½”λ“œ 포인트(숫자)λ₯Ό ν• λ‹Ήν•œλ‹€.

예λ₯Ό λ“€μ–΄

- ν•œκΈ€ `γ„±`은 `U+1100`에 ν• λ‹Ήλ˜μ–΄ 있고
- 이λͺ¨μ§€ `🐢`λŠ” `U+1F415`에 ν• λ‹Ήλ˜μ–΄ μžˆλ‹€.

![[hangul-choseong-kiyeok-symblcc.png|좜처: symbol.cc]]
![[dog-emoji-symblcc.png|좜처: symbol.cc]]

접두사 `U+`λŠ” μœ λ‹ˆμ½”λ“œλ₯Ό μ˜λ―Έν•˜κ³  `1F415`λŠ” 16μ§„μˆ˜λ‘œ 된 μ½”λ“œ ν¬μΈνŠΈλ‹€.

문자λ₯Ό `0`κ³Ό `1`둜 μ €μž₯ν•˜λŠ” 것을 "문자 인코딩"이라고 ν–ˆλ‹€. `UTF`λŠ” μœ λ‹ˆμ½”λ“œλ₯Ό μΈμ½”λ”©ν•˜λŠ” 방식이닀. 즉, μ½”λ“œ 포인트λ₯Ό 컴퓨터 λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜λŠ” 방식이닀.
UTF μΈμ½”λ”©μ˜ λ™μž‘μ€ [이 μ˜μƒ](https://youtu.be/MijmeoH9LT4?feature=shared)μ—μ„œ μžμ„Ένžˆ 확인할 수 μžˆλ‹€.

UTF 인코딩도 μ—¬λŸ¬ 가지 λ°©μ‹μœΌλ‘œ λ‚˜λ‰˜λŠ”λ°, UTF-8도 있고 UTF-16, UTF-32 등이 μžˆλ‹€.

UTF-32λ₯Ό 예둜 λ“€λ©΄, μ΄λ¦„μ—μ„œ μ•Œ 수 μžˆλ“―μ΄ μ½”λ“œ 포인트λ₯Ό 32bit둜 μ €μž₯ν•˜λŠ” 것이닀. λ”°λΌμ„œ `U+1F415`λŠ” `00 01 F4 15`κ°€ 되고 λ©”λͺ¨λ¦¬μ—μ„œ 4byteλ₯Ό μ°¨μ§€ν•œλ‹€.

[일반적으둜 UTF-8을 많이 μ‚¬μš©ν•˜κ³  μžˆλ‹€κ³  ν•œλ‹€.](https://stackoverflow.com/a/67773534)

## κ·Έλž˜μ„œ 이λͺ¨μ§€λŠ” μ™œ 그림으둜 ν‘œν˜„λ˜λŠ” 거지?

이λͺ¨μ§€μ™€ 기타 λ‹€λ₯Έ λ¬Έμžλ“€μ€ μœ λ‹ˆμ½”λ“œμ˜ 각 μ½”λ“œ ν¬μΈνŠΈμ— ν• λ‹Ήλ˜μ–΄ 있기 λ•Œλ¬Έμ— 별 μ°¨μ΄λŠ” μ—†μ–΄ 보인닀. κ·Έλž˜μ„œ λ‚΄κ°€ '이λͺ¨μ§€λŠ” 그림인데!'라고 μ™Έμ³λ΄€μž 이λͺ¨μ§€λ„ 각각이 ν•˜λ‚˜μ˜ 문자인 것이닀. κ·Έλ ‡μ§€λ§Œ 마음이 λ‹΅λ‹΅ν•˜λ‹€. 이λͺ¨μ§€λŠ”... 이미지이기 λ•Œλ¬Έμ΄λ‹€. 색상이 있고 ν™”λ €ν•˜λ‹€. κ²€μ€μƒ‰μœΌλ‘œλ§Œ 된 λ¬Έμžλž€ λ‹€λ₯΄λ‹€λŠ” 사싀이 λ‚΄ λ§ˆμŒμ„ 더 λ‹΅λ‹΅ν•˜κ²Œ λ§Œλ“€μ—ˆλ‹€. ν•˜μ§€λ§Œ λ‹€μŒκ³Ό 같은 사싀을 μ•Œκ²Œ λ˜μ—ˆλ‹€.

> 이λͺ¨μ§€λŠ” 글꼴이닀.
`0`κ³Ό `1`둜 μ €μž₯된 데이터λ₯Ό μ‚¬λžŒμ΄ 읽을 수 μžˆλ„λ‘ 문자 μ²΄κ³„λ‘œ λ³€ν™˜ν•΄ 화면에 ν‘œμ‹œν•΄ μ£ΌλŠ” 것을 μš°λ¦¬λŠ” κΈ€κΌ΄(폰트)라 λΆ€λ₯Έλ‹€.
κΈ€κΌ΄ νŒŒμΌμ—μ„œ 문자 ν•˜λ‚˜ν•˜λ‚˜λ₯Ό "글리프"라 ν•˜λŠ”λ°, 각 글리프에 이미지λ₯Ό 넣을 수 μžˆλ‹€.

macμ—μ„œ μ„œμ²΄ κ΄€λ¦¬μž 앱을 열어보면 "Apple Color Emoji"λΌλŠ” κΈ€κΌ΄κ³Ό ν•¨κ»˜ 3605개 글리프λ₯Ό 가지고 μžˆλ‹€λŠ” μ„€λͺ…도 λ³Ό 수 μžˆλ‹€.
![[mac-font-book.png|mac os의 μ„œμ²΄ κ΄€λ¦¬μž]]
ν…μŠ€νŠΈλ₯Ό νŠΉμ • κΈ€κΌ΄λ‘œ νƒ€μ΄ν•‘ν•˜κ³  μžˆμ„ λ•Œ 이λͺ¨μ§€κ°€ λ‚˜μ˜€λŠ” 경우 ν•΄λ‹Ή 글꼴에 이λͺ¨μ§€ 글리프가 μ—†μœΌλ©΄ μš΄μ˜μ²΄μ œλŠ” λ‹€λ₯Έ 글꼴을 μ°Έμ‘°ν•˜κ²Œ λœλ‹€.

![[dragon-emoji.png|κΈ°κΈ°λ§ˆλ‹€ λͺ¨μ–‘이 λ‹€λ₯΄λ‹€]]
결둠적으둜 글꼴이 λ‹€λ₯΄λ©΄ κΈ€μž λͺ¨μ–‘이 λ‹€λ₯΄κ²Œ λ³΄μ΄λŠ” κ²ƒμ²˜λŸΌ κΈ°κΈ°λ§ˆλ‹€ 이λͺ¨μ§€μ˜ λͺ¨μŠ΅μ΄ λ‹€λ₯Έ 것이닀.

## Variation Selector

μ–΄λ–€ 이λͺ¨μ§€λ“€μ€ 이미 μ˜ˆμ „λΆ€ν„° μœ λ‹ˆμ½”λ“œμ— μ‘΄μž¬ν–ˆμ—ˆλ‹€. 예λ₯Ό λ“€μ–΄, β€λŠ” μ½”λ“œ ν¬μΈνŠΈκ°€ `U+2764`둜 1993λ…„λΆ€ν„° μ‘΄μž¬ν–ˆλ‹€. 이λͺ¨μ§€μ—λ„ ❀️가 μžˆλ‹€. 이λͺ¨μ§€λ₯Ό μœ„ν•œ κΈ€κΌ΄ 말고도 λ‹€λ₯Έ 글꼴에도 ν•΄λ‹Ή μ½”λ“œ ν¬μΈνŠΈκ°€ μ‘΄μž¬ν•œλ‹€λŠ” 것이닀. 그럼 μš΄μ˜μ²΄μ œλŠ” λ‘˜ 쀑 μ–΄λ–€ 글꼴을 λ Œλ”λ§ ν•΄μ•Ό ν•˜λŠ”μ§€ κ²°μ •ν•˜λŠ” κ²ƒμΌκΉŒ?
μ—¬κΈ°μ„œ Variation Selector(`U+FE0F`)κ°€ ν•„μš”ν•˜λ‹€. ❀️도 μ½”λ“œ ν¬μΈνŠΈκ°€ `U+2764`μ§€λ§Œ 문자 뒀에 `U+FE0F`κ°€ μžˆλ‹€. κ·Έλž˜μ„œ λ‹€λ₯΄κ²Œ λ Œλ”λ§ λœλ‹€.

## Zero Width Joiner

이λͺ¨μ§€μ— λŒ€ν•΄ μ•Œμ•„λ³΄λ©΄μ„œ `ZWJ(Zero Width Joiner)`λΌλŠ” 것을 μ•Œκ²Œ λ˜μ—ˆλ‹€. κ°€μž₯ μ‹ κΈ°ν–ˆλ˜ 뢀뢄이닀.

μ—¬κΈ° 뢁극곰 이λͺ¨μ§€κ°€ μžˆλ‹€.

```js
const polarBear = 'πŸ»β€β„οΈ'
```

이 `polarBear` λ³€μˆ˜μ— [[JavaScript-Spread-syntax|spread 문법]]을 μ‚¬μš©ν•΄ 보자.

```js
;[...polarBear] // ['🐻', '', '❄', '️']
```

4개의 λ°°μ—΄λ‘œ λ‚˜λˆ μ§€λ©΄μ„œ 첫 번째둜 🐻, 두 번째둜 빈 λ¬Έμžμ—΄, μ„Έ λ²ˆμ§ΈλŠ” ❄ , λ„€ 번째둜 빈 λ¬Έμžμ—΄μ΄ λ‚˜μ˜¨λ‹€. πŸ»β€β„οΈ λŠ” 두 가지 이λͺ¨μ§€λ₯Ό μ‘°ν•©ν•΄μ„œ λ§Œλ“€μ–΄μ§€λŠ” 것 κ°™μ•„ 보인닀!
κ·Έλ ‡λ‹€λ©΄ 빈 λ¬Έμžμ—΄μ€ λ¬΄μ—‡μΌκΉŒ? 정말 빈 λ¬Έμžμ—΄μΈμ§€ 확인해 보자.

JavaScriptμ—μ„œ `charCodeAt`을 μ‚¬μš©ν•˜λ©΄ 주어진 index에 ν•΄λ‹Ήν•˜λŠ” μœ λ‹ˆμ½”λ“œ 값을 얻을 수 μžˆλ‹€.

```js
const [bear, one, snow, two] = [...polarBear]
one.charCodeAt(0) // 8205
two.charCodeAt(0) // 65039
```

μœ λ‹ˆμ½”λ“œ `8205`λŠ” ZWJ(zero with joiner)이고 `65039`λŠ” μ•žμ—μ„œ μ‚΄νŽ΄λ΄€λ˜ variation selectorλ‹€. ❄ λ¬ΈμžλŠ” 이미 μ‘΄μž¬ν•˜λŠ” λ¬Έμžμ΄κΈ°μ— ❄️ 이λͺ¨μ§€λ‘œ ν‘œν˜„ν•˜λ €λ©΄ 이게 ν•„μš”ν–ˆλ˜ 것이닀.
그럼 🐻 이λͺ¨μ§€μ™€ ❄️ 이λͺ¨μ§€λ₯Ό ν•©μΉ˜κΈ° μœ„ν•΄μ„œλŠ” ZWJλ₯Ό μ‚¬μš©ν–ˆλ‹€λŠ” 사싀을 μ•Œ 수 μžˆλ‹€.

이걸 λ”°λ‘œ λ³€μˆ˜μ— λ‹΄μ•„μ„œ ν…ŒμŠ€νŠΈν•΄ 보자.

```js
const [bear, ZWJ, snow, VARIATION_SELECTOR] = [...polarBear]
const woman = 'πŸ‘©'
const rice = '🌾'[(woman, ZWJ, rice)].join('') // πŸ‘©β€πŸŒΎ
```

이처럼 이λͺ¨μ§€λŠ” ν•˜λ‚˜λ‘œ 결합을 ν•  수 μžˆλ‹€! 이λͺ¨μ§€ 쑰합을 'Emoji ZWJ Sequence'라 ν•œλ‹€. λͺ¨λ“  이λͺ¨μ§€κ°€ 쑰합이 κ°€λŠ₯ν•œ 것은 μ•„λ‹ˆμ§€λ§Œ [λ‹€μ–‘ν•œ 쑰합이 κ°€λŠ₯](https://emojipedia.org/emoji-zwj-sequence)ν•˜λ‹€.

μ–΄μ¨Œκ±°λ‚˜ λ¬Έμžμ—΄ λ°°μ—΄λ‘œ λ§Œλ“€ 수 있기 λ•Œλ¬Έμ— λ°°μ—΄ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄ λ‹€μŒ λ™μž‘λ„ κ°€λŠ₯ν•˜λ‹€.

```js
'πŸ‘¨β€πŸ‘©β€πŸ‘¦'.replace('πŸ‘¦', 'πŸ‘§') // πŸ‘¨β€πŸ‘©β€πŸ‘§
```

## 이λͺ¨μ§€ μ•Œμ“Έμ‹ μž‘

이λͺ¨μ§€μ— λŒ€ν•΄ μ•Œμ•„λ³΄λ©΄μ„œ κ°œλ°œν•  λ•Œ μ•Œμ•„λ‘λ©΄ μ“Έ 데 μ—†κΈ΄ ν•˜μ§€λ§Œ κ·Έλž˜λ„ μ•Œκ²Œ 된 것듀이 λͺ‡ 가지 μžˆλ‹€.

### Database

첫 λ²ˆμ§ΈλŠ” λ‚΄κ°€ μ‹€μ œλ‘œ κ²ͺμ—ˆλ˜ 문제인데 MySQLμ—μ„œ ν…μŠ€νŠΈ 데이터에 이λͺ¨μ§€λ₯Ό μ €μž₯ν•˜κ³  μ‹Άμ—ˆλŠ”λ° μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” λ¬Έμ œκ°€ μžˆμ—ˆλ‹€.
이건 MySQL이 UTF-8을 κ΅¬ν˜„ν–ˆμ„ λ•Œ 3 byte 문자만 μ €μž₯ν•  수 μžˆμ–΄μ„œ 생긴 λ¬Έμ œμ˜€λ‹€. κ·Έλž˜μ„œ DBMS의 인코딩을 utf8mb4둜 λ³€κ²½ν•΄μ•Ό ν–ˆλ‹€. ([μ°Έκ³ ](https://www.lesstif.com/java/java-+-mysql-+-utf8mb4-emoji-51283094.html))

### 이λͺ¨μ§€μ˜ 길이

이λͺ¨μ§€ 뿐만 μ•„λ‹ˆλΌ μœ λ‹ˆμ½”λ“œμ—μ„œ μ—¬λŸ¬ μ½”λ“œ 포인트둜 μ‘°ν•©λœ 문자λ₯Ό μ œλŒ€λ‘œ 닀루지 μ•ŠμœΌλ©΄ λ‹€μŒκ³Ό 같은 버그가 λ°œμƒν•  μˆ˜λ„ μžˆλ‹€:
![[editor.gif]]

[codepen](https://codepen.io/)의 에디터인데 이λͺ¨μ§€ ν•˜λ‚˜(πŸ»β€β„οΈ)λ₯Ό μ§€μš°λŠ”λ° 4번의 ν‚€ μŠ€νŠΈλ‘œν¬κ°€ ν•„μš”ν–ˆλ‹€. μ§€μš°κ³  λ‚˜λ‹ˆ "🐻"κ°€ λ‚˜μ˜€λŠ” κ±Έ λ³΄λ‹ˆ μ•žμ—μ„œ spread λ¬Έλ²•μœΌλ‘œ λ‚˜λˆ μ§€λŠ” 각 μš”μ†Œκ°€ ν•˜λ‚˜μ˜ 문자둜 κ°„μ£Όλ˜μ§€ μ•ŠλŠ” λ“― 보인닀.

길이λ₯Ό ꡬ할 λ•Œλ„ λ¬Έμ œκ°€ μžˆλ‹€. JavaScriptμ—μ„œ λ¬Έμžμ—΄μ˜ 길이λ₯Ό ꡬ할 λ•Œ `length` λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. λ‹€μŒ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μž.

```js
const a = 'a'
const b = 'κ°€'
const c = 'πŸš€'

a.length // 1
b.length // 1
c.length // 2
```

`c` λ³€μˆ˜μ— ν• λ‹Ήν•œ 이λͺ¨μ§€λŠ” ν•˜λ‚˜μž„μ—λ„ λΆˆκ΅¬ν•˜κ³  μ˜ˆμƒκ³Ό λ‹€λ₯΄κ²Œ 길이가 `2`κ°€ λ‚˜μ˜¨λ‹€. 이게 무슨 일일까?

JavaScriptλŠ” λ¬Έμžμ—΄μ„ UTF-16으둜 닀루기 λ•Œλ¬Έμ΄λ‹€. πŸš€μ˜ μœ λ‹ˆμ½”λ“œλŠ” `U+1F680`κ³  UTF-32둜 μΈμ½”λ”©ν•˜λ©΄ `0001F680`, UTF-16둜 μΈμ½”λ”©ν•˜λ©΄ `0xD83D`와 `0xDE80`이라고 ν•œλ‹€. κ·Έλž˜μ„œ 길이가 `2`κ°€ λ˜λŠ” 것이닀.

[LodashλŠ” `toArray`둜 이 문제λ₯Ό ν•΄κ²°ν–ˆλ‹€κ³  ν•œλ‹€.](https://stackoverflow.com/a/46085147)

```js
import _ from 'lodash'
_.toArray('πŸ»β€β„οΈλΆκ·Ήκ³°').length // 4
```

---

DeppL λ²ˆμ—­μ•±μ˜ ν™•μž₯ ν”„λ‘œκ·Έλž¨λ„,
![[deepl-polarbear.png]]

λ§žμΆ€λ²• 검사기도 κΉ¨μ Έμ„œ λ‚˜μ˜¨λ‹€.
![[naver-polarbear.png]]

그리고 [Terminalμ—μ„œλ„ 이와 λΉ„μŠ·ν•œ λ¬Έμ œκ°€ μžˆλ‹€](https://darrenburns.net/posts/emoji-in-the-terminal/)κ³  ν•œλ‹€.

### 검색창 μžλ™μ™„μ„±

ꡬ글 검색창에 이λͺ¨μ§€λ₯Ό μž…λ ₯해도 μžλ™μ™„μ„±μ΄ λœλ‹€.

![[google-autocomplete.png]]
ZWJ Sequence 이λͺ¨μ§€λ₯Ό μž…λ ₯ν•˜λ©΄ λΆ„λ¦¬λΌμ„œ ν‘œμ‹œλ˜λŠ” 것을 확인할 수 μžˆμ—ˆλ‹€!

μΏ νŒ‘μ€ πŸ»β€β„οΈλ₯Ό κ²€μƒ‰ν–ˆλŠ”λ° πŸ»κ°€ μžλ™μ™„μ„±λœλ‹€.
![[coupang-autocomplete-polarbear.png]]

ν•˜μ§€λ§Œ 🐻만 μž…λ ₯ν•˜λ©΄ μžλ™μ™„μ„±μ΄ λ˜μ§€ μ•ŠλŠ”λ‹€.
![[coupang-autocomplete-bear.png]]

bing은 πŸ»β€β„οΈ 만 μžλ™μ™„μ„±λœλ‹€.
![[bing-autocomplete-polarbear.png]]

🐻λ₯Ό κ²€μƒ‰ν•˜λ©΄ λ‹€λ₯Έ 곰듀도 λ‚˜μ˜¨λ‹€.
![[bing-autocomplete-bear.png]]

μžλ™μ™„μ„± κΈ°λŠ₯을 κ΅¬ν˜„ν•  λ•Œ λ¬Έμžμ—΄μ„ μ²˜λ¦¬ν•˜λŠ” 방식에 따라 λ‹€μ–‘ν•˜κ²Œ λ™μž‘ν•˜λ‚˜ 보닀. μ™œ κ·ΈλŸ°μ§€λŠ” μ’€ 더 νƒκ΅¬ν•΄μ•Όκ² μ§€λ§Œ μ΄μœ κ°€ μžˆμ§€ μ•Šμ„κΉŒ?

## 글을 마치며

이λͺ¨μ§€μ™€ 인코딩을 ~~μ•„μ£Ό μ–•κ²Œ~~ κ³΅λΆ€ν–ˆλ‹€. 더 깊이 곡뢀해야 ν•  ν•„μš”μ„±μ„ λŠλ‚€λ‹€. 그러고 λ‚˜λ©΄ λ§ˆμ§€λ§‰μ— μ„œλΉ„μŠ€λ§ˆλ‹€ μžλ™μ™„μ„±μ΄ λ‹€λ₯΄κ²Œ λ‚˜μ˜€λŠ” μ΄μœ μ— λŒ€ν•΄μ„œλ„ μ•Œ 수 μžˆμ„ 것이닀!

## reference

- [Unicode와 UTF-8 κ°„λ‹¨νžˆ μ΄ν•΄ν•˜κΈ°](https://jeongdowon.medium.com/unicode%EC%99%80-utf-8-%EA%B0%84%EB%8B%A8%ED%9E%88-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-b6aa3f7edf96)
- https://gist.github.com/mandel59/d05522cdb42a652bf423
- [Zero Width Joiner](https://youtu.be/z0uUK0DUXro?feature=shared)
- [The Absolute Minimum Every Software Developer Must Know About Unicode in 2023](https://tonsky.me/blog/unicode/)
- [What is the unicode variation selector](https://stackoverflow.com/questions/4974668/what-is-the-unicode-variation-selector)
3 changes: 2 additions & 1 deletion wiki/wiki-index.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: wiki
date: 2017-11-26 21:38:36 +0900
updated: 2023-12-03 23:57:34 +0900
updated: 2024-01-06 10:32:51 +0900
---

- [[Movies-with-a-computer]]
Expand Down Expand Up @@ -42,6 +42,7 @@ updated: 2023-12-03 23:57:34 +0900
- [[Session-login-with-lowdb-in-express]]
- [[Https-redirect-in-Safai]]
- [[Drawing-Pixel-Art-in-Web]]
- [[Various-Aspects-of-Emoji]]
- CSS
- [[CSS-line-breaks|CSS둜 μ€„λ°”κΏˆ 처리λ₯Ό ν•˜λŠ” 방법]]
- [[CSS-z-index]]
Expand Down

0 comments on commit a2005d4

Please sign in to comment.