Swift에서의 유니코드(Unicode)

썹스·2022년 12월 9일
0

Swift 문법

목록 보기
49/68

유니코드(Unicode)

Unicode는 "Universal Coded Character Set"의 축약 단어이며, 전 세계의 모든 문자를 다루도록 설계된 부호체계입니다.

영문자는 아스키(ASCII)코드의 번호 체계를 유지하고 있습니다.

유니코드의 인코딩 방법은 총 8, 16, 32 Bits 3가지가 존재하며 각각의 특징이 존재합니다.

  • UTF-8: 1~4 Bytes의 가변길이 인코딩 (실제 통신에서 가장 많이 사용하는 방식)
  • UTF-16: 2~4 Bytes의 가변길이 인코딩
  • UTF-32: 4 Bytes의 인코딩 (실제로는 21비트만 사용, 나머지 11비트는 사용하지 않고 남음)

Swift에서의 유니코드(Unicode)

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]  // 에러: 단순 인덱스 접근이 불가능
profile
응애 나 코린이(비트코인X 코딩O)

0개의 댓글