문자열과 문자 (Strings and Characters) - 문자열의 유니코드 표현 (Unicode Representations of Strings)

00yhsp·2024년 4월 2일

유니코드 문자열이 텍스트 파일 또는 다른 저장소에 쓰여질 때 해당 문자열의 유니코드 스칼라는 정의된 유니코드 인코딩 형식 중 하나로 인코딩된다.
각 형식은 코드 유닛으로 알려진 작은 청크로 문자열을 인코딩한다.
이건승 UTF-8, UTF-16, UTF-32 방식을 포함한다.

Swift는 문자열의 유니코드 표현에 접근하는 여러가지 방법을 제공한다.
for-in 구문으로 문자열을 반복하여 유니코드 확장된 문자소 클러스터인 Character 값에 접근할 수 있다.

또는 세 가지 다른 유니코드 호환 표현 중 하나로 String 값에 접근할 수 있다.

  • UTF-8 (문자열의 utf8 프로퍼티로 접근)
  • UTF-16 (문자열의 utf16 프로퍼티로 접근)
  • 문자열의 UTF-32 인코딩 형식에 해당하는 21-bit 유니코드 스칼라 값 (문자열의 unicodeScalars 프로퍼티로 접근)

아래의 각 예제는 D, o, g, !! 문자(Double EXCLAMATION MARK 또는 유니코드 스칼라 U+203C)와 🐶 문자(DOG FACE 또는 유니코드 스칼라 U+1F436)로 구성된 문자열에 대한 다른 표현을 보여 준다,

let dogString = "Dog‼🐶"

UTF-8 표현

utf8 프로퍼티 반복을 통해 String의 UTF-8 표현에 접근할 수 있다.
이 프로퍼티는 문자열의 UTF-8 표현에서 각 바이트에 대해 하나씩 부호가 없는 8-bit (UInt8) 값의 모음인 String.UTF8View 타입이다.

for codeUnit in dogString.utf8 {
    print("\(codeUnit) ", terminator: "")
}
print("")
// Prints "68 111 103 226 128 188 240 159 144 182 "

위 예제에서 첫번째 3개의 codeUnit 값 (68, 111, 103)은 ASCII와 같은 UTF-8 표현인 문자 D, o, 그리고 g 를 나타낸다.
다음 3개의 codeUnit 값 (226, 128, 188)은 DOUBLE EXCLAMATION MARK 문자의 3 바이트 UTF-8 표현이다.
마지막 4개의 codeUnit 값 (240, 159, 144, 182)은 DOG FACE 문자의 4 바이트 UTF-8 표현이다.

UTF-16 표현

utf16 프로퍼티 반복을 통해 String 에 UTF-16 표현에 접근할 수 있다.
이 프로퍼티는 문자열의 UTF-16 표현에서 각 16-bit 코드 유닛에 대해 하나씩 부호가 없는 16-bit (UInt16) 값의 모음인 String.UTF16View 타입이다.

for codeUnit in dogString.utf16 {
    print("\(codeUnit) ", terminator: "")
}
print("")
// Prints "68 111 103 8252 55357 56374 "

다시 처음 3개의 codeUnit 값 (68, 111, 103)은 UTF-16 코드 유닛은 문자열의 UTF-8 표현과 같은 값을 가지므로 문자 D, o, 그리고 g이다 (유니코드 스칼라는 ASCII 문자를 표현하기 때문).

4번째 codeUnit 값 (8252)는 DOUBLE EXCLAMATION MARK 문자에 해당하는 유니코드 스칼라 U+203C 에서 16진법 203C 값을 나타내는 10진법 수이다. 이 문자는 UTF-16에서 하나의 코드 유닛으로 표현할 수 있다.

5번째와 6번째 codeUnit 값 (55357 과 56374)은 DOG FACE 문자의 UTF-16 대리 쌍 표현이다. 이 값은 높은 대리 값 U+D83D (10진법 값 55357)와 낮은 대리 값 U+DC36 (10진법 값 56374)이다.

유니코드 스칼라 표현

unicodeScalars 프로퍼티 반복을 통해 String 값에 유니코드 스칼라 표현에 접근할 수 있다. 이 프로퍼티는 UnicodeScalar 타입의 값의 모음인 UnicodeScalarView 타입이다.

각 UnicodeScalar 는 UInt32 값 안에 표현된 스칼라의 21-bit 값을 반환하는 value 프로퍼티를 가지고 있다.

for scalar in dogString.unicodeScalars {
    print("\(scalar.value) ", terminator: "")
}
print("")
// Prints "68 111 103 8252 128054 "

다시 한번 value 프로퍼티를 통해 얻은 처음 3개의 UnicodeScalar 값(68, 111, 103)은 문자 D, o, 그리고 g 를 표현한다.

4번째 codeUnit 값 (8252)은 DOUBLE EXCLAMATION MARK 문자에 해당하는 유니코드 스칼라 U+203C 에서 16진법 203C 와 동일한 10진법 수이다.

value 프로퍼티의 마지막 UnicodeScalar 인 128054 는 DOG FACE 문자에 해당하는 유니코드 스칼라 U+1F436 에서 16진법 1F436 의 10진법 수이다.

value 프로퍼티 대신에 각 UnicodeScalar 값은 문자열 삽입을 사용하는 것과 같이 새로운 String 값을 생성하는데 사용할 수 있다.

for scalar in dogString.unicodeScalars {
    print("\(scalar) ")
}
// D
// o
// g
// ‼
// 🐶
profile
iOS Dev

0개의 댓글