์บ๋ฆญํฐ ๐ฉโ๐ฉโ๐งโ๐ฆ (์ฌ์ฑ 2 ๋ช , ์๋ 1 ๋ช , ์๋ 1 ๋ช )์ ๋ค์๊ณผ ๊ฐ์ด ์ธ์ฝ๋ฉ๋ฉ๋๋ค.
U+1F469
WOMAN
,
โU+200D
ZWJ
,
U+1F469
WOMAN
,
U+200D
ZWJ
,
U+1F467
GIRL
,
U+200D
ZWJ
,
U+1F466
BOY
๋งค์ฐ ํฅ๋ฏธ๋กญ๊ฒ ์ธ์ฝ๋ฉ๋์์ต๋๋ค. ๋จ์ ํ ์คํธ๋ฅผ์ํ ์๋ฒฝํ ๋ชฉํ. ๊ทธ๋ฌ๋ Swift๋ ๊ทธ๊ฒ์ ์น๋ฃํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ ๋๋ค. ์ฌ๊ธฐ ๋ด๊ฐ ์๋ฏธํ๋ ๋ฐ๊ฐ์๋ค :
"๐ฉโ๐ฉโ๐งโ๐ฆ".contains("๐ฉโ๐ฉโ๐งโ๐ฆ") // true
"๐ฉโ๐ฉโ๐งโ๐ฆ".contains("๐ฉ") // false
"๐ฉโ๐ฉโ๐งโ๐ฆ".contains("\u{200D}") // false
"๐ฉโ๐ฉโ๐งโ๐ฆ".contains("๐ง") // false
"๐ฉโ๐ฉโ๐งโ๐ฆ".contains("๐ฆ") // true
๋ฐ๋ผ์ Swift๋ ์์ฒด (์ข์)์ ์๋ (์ข์!)์ ํฌํจํ๊ณ ์๋ค๊ณ ๋งํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ฌ์, ์ฌ์ ๋๋ ํญ์ด 0 ์ธ ๊ฒฐํฉ์๋ฅผ ํฌํจํ์ง ์๋๋ค๊ณ ๋งํฉ๋๋ค. ์ฌ๊ธฐ์ ๋ฌด์จ ์ผ์ด์ผ? ์ Swift๋ ๋จ์๋ ์์ง๋ง ์ฌ์ ๋ ์ฌ์๋ ํฌํจํ์ง ์๋๋ค๊ณ ์๊ณ ์์ต๋๊น? ๊ทธ๊ฒ์ด ํ๋์ ๋ฌธ์๋ก ์ทจ๊ธํ๊ณ ์์ ์ ํฌํจํ๊ณ ์๋ ๊ฒ์ ์ธ์ํ๋ค๋ฉด ์ดํดํ ์ ์์์ง๋ง ํ๋์ ํ์ ๊ตฌ์ฑ ์์๊ฐ ์๊ณ ๋ค๋ฅธ ๊ตฌ์ฑ ์์๊ฐ ์๋ค๋ ์ฌ์ค์ด ๋๋ฅผ ๋ฐฉํดํฉ๋๋ค.
๋ด๊ฐ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๋ฉด ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค "๐ฉ".characters.first!
.
๋ ํผ๋์ค๋ฌ์ด ๊ฒ์ ์ด๊ฒ์ ๋๋ค.
let manual = "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F466}"
Array(manual.characters) // ["๐ฉโ", "๐ฉโ", "๐งโ", "๐ฆ"]
ZWJ๋ฅผ ๊ฑฐ๊ธฐ์ ๋ฐฐ์นํ์ง๋ง ๋ฌธ์ ๋ฐฐ์ด์๋ ๋ฐ์๋์ง ์์ต๋๋ค. ๋ค์์ ์ฝ๊ฐ์ ์ด์ผ๊ธฐ์์ต๋๋ค.
manual.contains("๐ฉ") // false
manual.contains("๐ง") // false
manual.contains("๐ฆ") // true
๋ฐ๋ผ์ ๋ฐฐ์ด์ด ์ด๋ป๊ฒ ๋ณด์ด๋์ง ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๋ฐฐ์ด๊ณผ ๋์ผํ ๋์์ ์ป์ต๋๋ค.
๋ด๊ฐ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๋ฉด ์ด๊ฒ๋ ๋ฐ๋์ง ์์ต๋๋ค "๐ฉ".characters.first!
.
"๐ฉโ๐ฉโ๐งโ๐ฆ".contains("\u{200D}")
์ฌ์ ํ ๋ฒ๊ทธ ๋๋ ๊ธฐ๋ฅ์ธ์ง ํ์คํ์ง ์์ ๊ฒฝ์ฐ false๋ฅผ ๋ฐํํฉ๋๋ค.