1. 'Character' type
๋ฌธ์ representation ์ฒด๊ณ ์ค์๋ ASCII๊ฐ ์์ต๋๋ค. ์์คํค๋ ๋ฌธ์๋ฅผ 7๋นํธ๋ก ํํํ๋ ์ต๋ 128๊ฐ์ ๋ฌธ์๋ฅผ ๋ํ๋ผ ์ ์๋ ์ฒด๊ณ์ ๋๋ค. ์ด๊ฒ์ ๋ํ super (char) set์ผ๋ก ๋์จ UTF-8์ ์ด ์์คํค ํํ ๊ด๊ณ๋ฅผ ๊ทธ๋๋ก ์์ํ์ฑ๋ก, ๋ฌธ์ ์คํํธ๋ผ์ ๋ํ ์บ๋ฆญํฐ ์ธํธ์ ๋๋ค.
2. Operation on Character < type checking >
// ์ด๊ฑฐ ๊ณต๋ฐฑ๋ฌธ์ ๋ง๋?
let space: Character = " "
space.isWhitespace -> true or false
// ์ด ์บ๋ฆญํฐ๋ ์์คํค ์ฒด๊ณ์ ์๋ ๊ฑฐ๋?
let aChar = "a"
aChar.isASCII
// ์ด๊ฑฐ 16์ง๋ฒ ํํํ๋ ์ฒด๊ณ ์ค ํ๋๋( 0-9, a-f or A-F )
let aChar2 = "s"
aChar2.isHexDigit
>>> ๋ฌธ์๋ฅผ ๊ทธ ๋ฌธ์๊ฐ ๋ํ๋ด๋ Int ์๋ฃํ์ผ๋ก ๋ณํํ๊ธฐ
let unicodeNine: Character = "9"
unicodeNine.wholeNumberValue
์บ๋ฆญํฐํ์๋ฐ์ดํฐ.wholeNumberValue! -> ๋ฌธ์์ฒด๊ณ์์ ๊ทธ ๋ฌธ์๊ฐ ๋ํ๋ด๋ ์ซ์๋ฅผ ์ ์ํ์ผ๋ก
3. ์คํธ๋ง(์บ๋ฆญํฐ์ ์ปฌ๋ ์ )์ ์ธ์ฝ๋ฉ ๋ชจ๋์ ์๋ฏธ
์ธ์ฝ๋ฉ ๋ฐฉ์์ผ๋ก : UTF-32๋ชจ๋๋ฅผ ๊ณ ๋ฅธ๋ค๋ ๊ฒ์, ์คํธ๋ง์ ๋ฉค๋ฒ๋ค์ธ ์ฝ๋ํฌ์ธํธ๋ค์ ํ๋๋น ๋๋์ก์ UINT32๋ฅผ ์์ ๋์ํํํ ๊ฒ์ด๋ฉฐ, ๊ทธ๋ ๋ค๋ฉด, ์ด ์คํธ๋ง์ ํ๋๋น 32๋นํธ ์ง๋ฆฌ์ธ ์ฝ๋ ํฌ์ธํธ๋ค์ด ๋ชจ์ธ [UINT32] ๊ฐ ๋๋ ๊ฒ์ ๋๋ค.
ํ์ง๋ง, ์ด๋ ๊ฒ UINT-32๋ ์์ฒญ๋ ๋ญ๋น์ ๋๋ค. ์๋ํ๋ฉด, ์ธ๊ณ ๋๋ถ๋ถ ์ธ์ด์ ๋ฌธ์๋ฅผ ๋์ํํ ๊ฐ๋ฅํ ์ ๋์ฝ๋๋ 21๋นํธ๋ ๋ค ์ฐ์ง ๋ชปํ๋ ์ํ(์ฝ 110๋ง๊ฐ ํ๊ณ , ๋ ๋ชป์ฑ์ฐ๋ ์ํ) ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋์ ๋งค์ฐ ์ ์ฐํ ์ฒด๊ณ์ธ, utf-8์ด ์ฌ์ฉ๋ฉ๋๋ค. ์ธ๊ณ์ ๋ฌธ์๋ฅผ ๋งตํํ๋ ์ฒด๊ณ์ธ ์ ๋์ฝ๋๋, ์ต๋ 21๋นํธ๋ฅผ ์ด์ฉํ์ฌ, ๊ฐ ๊ตญ์ ๋ฌธ์๋ค(์ฝ 110๋ง๊ฐ)์ code point๋ก ๋งตํ ์์ผ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์์ ์ฌ์ง์ ๋ด ์๋ค.
4. ์ด๋ค Character์ ์ฝ๋ ์ ๋ ์งํฉ์ ํ์ธํ๊ธฐ :
>>> Character.utf8 -> code unit๋ค์ ์ปฌ๋ ์ ์ ๋ฆฌํด
let char = "\u{00BD}" // ½ <- ์ด ๊ธ์ ์
๋๋ค
// utf8์ผ๋ก ํํํ์ ๋ ์์์ ์ค๋ช
ํ, ๋ฌธ์๋ฅผ ์ด๋ฃจ๋ code unit๋ค์ ๋ฆฌํดํฉ๋๋ค.
for i in char.utf8 {
print(i)
}
// < UTF-8 views - code Units - 8๋นํธ๋ฅผ ์ฐ๋ ๋น์ฐํ ์ ๋์ 2๊ฐ๊ฒ ์ฃ . ์ฆ ๋ฉ๋ชจ๋ฆฌ์์๋ 2๋ฐ์ดํธ๋ฅผ
//์ฐ๋ 8๋นํธ๋ฅผ ์๊ตฌํ๋ ์บ๋ฆญํฐ์ธ ๊ฒ์
๋๋ค.>
// code units that makes up the string
//194
//189
// (110)00010 = 194
// (10)111101 = 189
5. ์คํธ๋ง์ ์ฝ๋์ ๋ ๋ชจ์์ ๊ด์ฐฐํด๋ด ์๋ค.
"+½โจ๐" ์ด ์คํธ๋ง์ utf-8์ ์ํ, ์ฝ๋ ์ ๋๋ค์ ๋ณด์๊ฒ ์ต๋๋ค.
let characters = "+\u{00bd}\u{21e8}\u{1f643}"
for i in characters.utf8{ // code unit - one
print("\(i) : \(String(i, radix: 2))")
if (i == 43 || i == 189 || i == 168){
print()
}
}
.utf8 ์ปฌ๋ ์ ์ ๋ฐ์ code units๋ค์ ์ดํฐ๋ ์ด์ ํด๋ณด๋, ๋ค์๊ณผ ๊ฐ์ด ๋์ต๋๋ค.
+ : 1 ~ 7 ๋นํธ ์ซ์๋ก ๋งตํ๋ ๋ฌธ์ => 1 ๋ฐ์ดํธ ์ด์ฉ
43 : 101011
½ : 8๋นํธ ~ 11๋นํธ ์ซ์๋ก ๋งตํ๋ ๋ฌธ์ => 2๋ฐ์ดํธ ์ด์ฉ
194 : 11000010
189 : 10111101
" ์ค์ ์ปดํจํฐ์๋ 2๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ์ฌ, 110|00010 / 10|111101 => 10111101 => utf-8์ ์ํด 189๋ผ๋ ์ซ์์ ๋์๋ ๋ฌธ์
ํ์ง๋ง ์ฝ๊ฒ ์ ์ ์๋ฏ์ด, 7๋นํธ๋ฅผ ์ฌ์ฉํ๋ฉด 0 ~ 128์ด๋ผ๋ ์ซ์ ๋ฒ์ ๊น์ง ๋ฐ์ ๋งตํ๋์ง ๋ชปํ์ฃ . 189์ ๋์ํ๋ ½ ๋ผ๋ ๋์
8๋นํธ๋ฅผ ์ฌ์ฉํด์ผ ํํํ ์ ์๊ณ ๊ทธ๋ฌ๋ ค๋ฉด, 2๋ฐ์ดํธ, 2๊ฐ์ ์ฝ๋ ์ ๋์ ์ฌ์ฉํด์ผํฉ๋๋ค. "
โจ : 12๋นํธ ~ 16๋นํธ ์ซ์๋ก ๋งตํ๋ ๋ฌธ์ => 3๋ฐ์ดํธ ์ด์ฉ
226 : 11100010
135 : 10000111
168 : 10101000
๐ : 17๋นํธ ~ 21๋นํธ ์ซ์๋ก ๋งตํ๋ ๋ฌธ์ => 4๋ฐ์ดํธ ์ด์ฉ
240 : 11110000
159 : 10011111
153 : 10011001
131 : 10000011
6. ์ UTF-16, 32๋ณด๋ค ๋์๊ฐ?
์ด ์ธ์ฝ๋ฉ ์ฒด๊ณ๋, ํ ์ฝ๋ ํฌ์ธํธ( ๋ฌธ์๊ฐ ๋งตํ๋ ์ )๋ฅผ ๋ํ๋ด๋ ๋ฐ, ์ต์ํ 16๋นํธ(2๋ฐ์ดํธ), 32๋นํธ(4๋ฐ์ดํธ)๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค.
์ด๋ ๊ฒํ๋ฉด, ์ฝ๋ ํฌ์ธํธ์ ๋ฐ๋ผ, ์ ์ฐํ๊ฒ 1 ~ 4๋ฐ์ดํธ๋ฅผ ํ๋ ฅ์ ์ผ๋ก ์ฌ์ฉํ๋ UTF-8๋ณด๋ค, ํจ์ฌ ๋ ๋ง์ ๋ฐ์ดํธ(์ฉ๋)์ ์ฌ์ฉํด์ผํฉ๋๋ค. ๋น์ฉ์ ์ผ๋ก ๋งค์ฐ ๋นํจ์จ์ ์ด์ฃ . ์) UTF-32๋ฉด, ์ ์ 4๊ฐ์ ์ฝ๋ํฌ์ธํธ ๊ฐ๊ฐ์ ๋ชจ๋ 32๋นํธ(4๋ฐ์ดํธ)๋ก ํํํ๋ ๊ฒ์ด๋ผ ๋ญ๋น๊ฐ ๋งค์ฐ ๋งค์ฐ ์ฌํ ๊ฒ์ด๊ณ , ๋ง์ฝ ๊ทธ๋ฆฌ์ค๋ฌธ์ ์์ฃผ๋ก ๋์จ ๊ธ์ ๊ทธ๋ ๊ฒ ์ธ์ฝ๋ฉํ๋ค๋ฉด, ์ฉ๋์ 4๋ฐฐ๋ฅผ ๋ ์ฐ๊ณ , ๊ฐ์ ์คํธ๋ง์ ์ ์ฅํ๋ ๊ฒ์ด ๋๊ฒ ์ฃ .
๋จ์ ์ ?? Search : O(n) UTF-8 vs O(1) UTF-32
์ฝ๋ํฌ์ธํธ์ ๋ฒ์๋ณ๋ก ์ฝ๋ ์ ๋ ๊ฐฏ์(1๋ฐ์ดํธ)๊ฐ ๋ฌ๋ผ์, ์คํผ๋ ์ด์ ์ ์ ์ฉํ ๋ ๋งค์ฐ ํ๋ค๋ค. ์๋ฅผ ๋ค์ด, 3๋ฒ์งธ ๋ฌธ์๋ก ์ ํํ๋ผ ๋ผ๋ ๋ช ๋ น์ด ์๋ค๋ฉด, ๋ชจ๋ ๋ฐ์ดํธ๋ค์ ์ ๊ฒํ์ฌ ๋์ด๋๊ฐ๋ฉด์ ์ฐพ์์ผํ๋ค. 32๋ฐ์ดํธ๋ฉด ๋ฐ๋ก ๋ฐ์ดํธ ์ฃผ์๋ฅผ ์ง์ ํ๋ฉด, ์ผ์ ํ๊ฒ ์ฐพ์ ์ ์๋ค. ์คํธ๋ง ์คํผ๋ ์ด์ ์ ๋น์ฐํ 32๋ฐ์ดํธ๋ณด๋ค ๋๋ฆด ์ ์๋ ๊ฒ์ด๋ค.
7. UTF-16 ์ธ์ฝ๋ฉ swift's pick !!
unicode codepoint์ 16๋นํธ๋ก ํํ๊ฐ๋ฅํ ์ซ์์ ๋์๋, 0 ~ 2^16 - 1 ๋ฌธ์๊น์ง๋ 16๋นํธ ๋จ์์ code unit, 17 ~ 21๋นํธ๋ก ํํ๋๋ ์์ ๋งตํ๋ ์์๋ ๋ ๊ฐ์ codeunit๋ค์ ์ฌ์ฉํ๋ ์ธ์ฝ๋ฉ ๋ฐฉ์.
< Surrogate Pair ๋ฐฉ์ >
์ ๊ฒ์๋ ๋ง์๋ฉด์ ๋ฐฐ์ฐ๋ ๋ฐ, ์ด๊ฒ๋ ์ง์ ํ ๋ณต์กํ ์ฝ๋ํฌ์ธํธ๋ฅผ ์ ๋์ผ๋ก ์ ํ์์ผ๋ณด๋ฉด์ ๋ฐฐ์๋ณด์ฃ .
\u{0x1F643} // => upside-down smiley emoji
// 17๋นํธ๋ก ํํ๋๋ ์ซ์์ ๋์๋๋ ๋ฌธ์๊ตฐ์.
// -> ๐
Surrogate pair for 17<= <=21
2 utf-16 code units
Represent the following hexadecimal codePoint
\u{1f643} : upside down smile emoji ๐
// 1). 16์ด ๋๋ ๋ถ๋ถ์ ์์ธ 1์ ๋นผ์ค๋ค.
// 17๋ฒ์งธ ๋นํธ๋ฅผ ๋นผ์ค๋ค. -> 0์ผ๋ก
// subtract 0x10000
// - 1 0000 0000 0000 0000 (in hexa)
// ๊ทธ๋ฌ๋ฉด ๊ทธ ๋ฌธ์๋ => \u{F643} ์ด ๋ฉ๋๋ค.
// 2). ์ด ๋๋จธ์ง 20๋นํธ๋ฅผ ๋๊ฐ๋ก ๋๋
// 0000 1111 01 / 10 0100 0011
// ์ ์๋ก๊ฒ์ดํธ / ์๋ซ ์๋ก๊ฒ์ดํธ
// ์ ์๋ก๊ฒ์ดํธ ์กฐ๊ฐ์ D800๋ํ๊ธฐ
// 0000 0000 0011 1101
// 1101 1000 0000 0000 +
// D 8 3 D => HIGH SURROGATE
// ๋ท ์๋ก๊ฒ์ดํธ ์กฐ๊ฐ์ DC00 ๋ํ๊ธฐ
// 0000 0010 0100 0011
// 1101 1100 0000 0000 +
// D E 3 3 => LOW SURROGATE
// 3). ์ด๊ฒ์ ์ด์ด๋ถ์ด๊ธฐ
// ๊ทธ๋ ๋ค๋ฉด ์ด๊ฒ์ ๋๊ฐ์ 16๋นํธ์ง๋ฆฌ ์ฝ๋ ์ ๋ ๋๊ฐ๋ฅผ ์ฐ๋
// D 8 3 D / D E 3 3
// ๋ค์์ ์ซ์๊ฐ ๋ฉ๋๋ค.
// ๋ ๊ฐ์ ์ ๋์ด ํ์ํ์ฃ ?
1). ๋จ์
1. utf-8์ ๋นํด, 7bit์ดํ์ ์ซ์์ ๋์๋๋ ๋ฌธ์๊ฐ ๋ง์ ๊ฒฝ์ฐ, 1๋ฐ์ดํธ(8๋นํธ)๋ฅผ ๋ ์ฌ์ฉํด์ ๊ทธ ๋ฌธ์๋ฅผ ์ ์ฅํ๊ฒ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ผํด ๋ฌธ์๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฑฐ์ ๋ชจ๋ ๊ธ์์์ 8๋นํธ(1๋ฐ์ดํธ)๋ฅผ ๋ ์จ์ ๊ทธ ๋ฌธ์๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด๋ค.
2). ์ฅ๋ค
1. UTF-8์ ๋นํด Operation์ ์ฉ์ ๋ ํจ์จ์ (ํ ๋ฌธ์๊ฐ 1์ ๋, 2์ ๋, 3์ ๋, 4์ ๋์ ์ฐ๊ธฐ ๋๋ฌธ์.)
+
2. utf-32์ ๋นํด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํจ์จ์ ( ๋ชจ๋ ๋ฌธ์์ 32๋นํธ, 4๋ฐ์ดํธ๋ฅผ ์ฐ๊ธฐ ๋๋ฌธ. )