Unicode는 "Universal Coded Character Set"의 축약 단어이며, 전 세계의 모든 문자를 다루도록 설계된 부호체계입니다.
영문자는 아스키(ASCII)코드의 번호 체계를 유지하고 있습니다.
유니코드의 인코딩 방법은 총 8, 16, 32 Bits 3가지가 존재하며 각각의 특징이 존재합니다.
Swift에서는 전 세계 사람들이 사용할 수 있는 부호 체계인 유니코드(Unicode)를 사용하고 있습니다.
Swift에서 문자열은 개별 인코딩된 각각의 유니코드 문자들로 구성되어 있으며, 이를 유니코드 값 또는 스칼라값이라 부릅니다.
실제 Swift에서 문자열을 저장할 때는 문자열에 포함된 각각의 문자를 스칼라값(UTF-32)으로 저장합니다.
스칼라값(UTF-32)으로 저장된 문자는 언제든지 UTF-8, UTF-16으로 쉽게 변환할 수 있습니다.
✅ 문자열의 유니코드(UTF-32)값 확인
var hello = "Hello~! 😀" for i in hello.unicodeScalars{ // unicodeScalars = UTF-32 print("\(i): \(i.value)") } /* 출력 결과 H: 72 //오른쪽의 숫자가 UTF-32의 유니코드값(스칼라값)입니다. e: 101 l: 108 l: 108 o: 111 ~: 126 !: 33 : 32 😀: 128512 //UTF-32에서는 😀을 저장하기 위해서 1칸의 공간이 필요합니다. */
✅ UTF-32 문자열을 UTF-8로 변환
var hello = "Hello~! 😀" for i in hello.utf8{ // UTF-32를 UTF-8로 변환 print(i) } /* 출력 결과 72 101 108 108 111 126 33 32 240 // UTF-8에서는 😀을 저장하기 위해서 4칸의 공간이 필요합니다. 159 // UTF-8에서는 😀을 저장하기 위해서 4칸의 공간이 필요합니다. 152 // UTF-8에서는 😀을 저장하기 위해서 4칸의 공간이 필요합니다. 128 // UTF-8에서는 😀을 저장하기 위해서 4칸의 공간이 필요합니다. */
✅ UTF-32 문자열을 UTF-16로 변환
var hello = "Hello~! 😀" for i in hello.utf16{ // UTF-32를 UTF-16으로 변환 print(i) } /* 출력 결과 72 101 108 108 111 126 33 32 55357 // UTF-16에서는 😀을 저장하기 위해서 2칸의 공간이 필요합니다. 56832 // UTF-16에서는 😀을 저장하기 위해서 2칸의 공간이 필요합니다. */
유니코드 환경에서 각각의 코드가 다르게 저장된다 하더라도 인간 생활에서 사용하는 코드로 변환하여 인식합니다.
✅ 한글의 경우
// "한"의 유니코드 값을 16진법으로 표기하면 "D56C"입니다. var han = "\u{D55C}" //한 print(han.count) // 1 var h_a_n = "\u{1112}\u{1161}\u{11AB}" //ㅎ + ㅏ + ㄴ print((h_a_n).count) // 1 print(h_a_n) // 한 han == h_a_n // true -> 같은 글자로 인식
✅ 영어의 경우
var resume = "resume" print(resume.count) //6 var résumé = "re"+"\u{301}"+"sume"+"\u{301}" print(résumé.count) //6
또한, Swift에서 문자열은 배열의 단순 인덱스(index)를 사용한 접근이 불가능합니다.
✅ 단순 인덱스로 문자열 접근
var hello = "hello" hello[0] // 에러: 단순 인덱스 접근이 불가능