🔥 문자열의 Unicode 표현
Swift에서는 문자열을 Unicode로 표현할 수 있습니다. Unicode는 전 세계의 거의 모든 문자를 표현하기 위한 국제 표준이에요. 문자열을 저장소나 텍스트 파일에 쓸 때, 해당 문자열의 Unicode 스칼라(scalar)들은 여러 Unicode에서 정의한 인코딩 형식 중 하나로 인코딩됩니다. 각 형식은 문자열을 코드 단위(code unit)라고 불리는 작은 덩어리로 인코딩하는데, 여기에는 UTF-8 인코딩 형식(8비트 코드 단위로 문자열 인코딩), UTF-16 인코딩 형식(16비트 코드 단위로 문자열 인코딩), UTF-32 인코딩 형식(32비트 코드 단위로 문자열 인코딩) 등이 있죠.
Swift는 문자열의 Unicode 표현에 접근할 수 있는 여러 가지 방법을 제공합니다. for
-in
문을 사용하여 문자열을 순회하면서 개별 Character
값을 Unicode 확장 자소 클러스터(extended grapheme cluster)로 접근할 수 있어요. 이 과정은 문자로 작업하기에서 설명하고 있습니다.
또는 다음 세 가지 Unicode 호환 표현 중 하나로 String
값에 접근할 수도 있습니다:
- UTF-8 코드 단위 컬렉션 (문자열의
utf8
속성으로 접근) - UTF-16 코드 단위 컬렉션 (문자열의
utf16
속성으로 접근) - 21비트 Unicode 스칼라 값의 컬렉션으로, 문자열의 UTF-32 인코딩 형식과 동일 (문자열의
unicodeScalars
속성으로 접근)
아래 각 예제는 D
, o
, g
, ‼
(DOUBLE EXCLAMATION MARK
, 또는 Unicode 스칼라 U+203C
), 그리고 🐶 문자(DOG FACE
, 또는 Unicode 스칼라 U+1F436
)로 이루어진 문자열의 서로 다른 표현을 보여줍니다.
UTF-8 표현
String
의 UTF-8 표현에 접근하려면 해당 문자열의 utf8
속성을 순회하면 됩니다. 이 속성은 String.UTF8View
타입으로, 문자열의 UTF-8 표현에서 각 바이트마다 하나씩 부호 없는 8비트(UInt8
) 값의 컬렉션이에요.
let dogString = "Dog‼🐶" for codeUnit in dogString.utf8 { print("\(codeUnit) ", terminator: "") } print("") // 출력 결과: "68 111 103 226 128 188 240 159 144 182 "
swift
위 예제에서 처음 세 개의 십진수 codeUnit
값(68
, 111
, 103
)은 D
, o
, g
문자를 나타내는데, 이들의 UTF-8 표현은 ASCII 표현과 동일합니다. 다음 세 개의 십진수 codeUnit
값(226
, 128
, 188
)은 DOUBLE EXCLAMATION MARK
문자의 3바이트 UTF-8 표현이에요. 마지막 네 개의 codeUnit
값(240
, 159
, 144
, 182
)은 DOG FACE
문자의 4바이트 UTF-8 표현입니다.
UTF-16 표현
String
의 UTF-16 표현에 접근하려면 문자열의 utf16
속성을 순회하세요. 이 속성은 String.UTF16View
타입으로, 문자열의 UTF-16 표현에서 각 16비트 코드 단위마다 하나씩 부호 없는 16비트(UInt16
) 값의 컬렉션입니다.
for codeUnit in dogString.utf16 { print("\(codeUnit) ", terminator: "") } print("") // 출력 결과: "68 111 103 8252 55357 56374 "
swift
다시 한번, 처음 세 개의 codeUnit
값(68
, 111
, 103
)은 D
, o
, g
문자를 나타내며, 이들의 UTF-16 코드 단위는 UTF-8 표현에서와 같은 값을 가집니다(이 Unicode 스칼라들은 ASCII 문자를 나타내기 때문이죠).
네 번째 codeUnit
값(8252
)은 16진수 값 203C
의 십진수 표현인데, 이는 DOUBLE EXCLAMATION MARK
문자에 대한 Unicode 스칼라 U+203C
를 나타냅니다. 이 문자는 UTF-16에서 단일 코드 단위로 표현될 수 있어요.
다섯 번째와 여섯 번째 codeUnit
값(55357
과 56374
)은 DOG FACE
문자의 UTF-16 서로게이트 쌍(surrogate pair) 표현입니다. 이 값들은 U+D83D
의 상위 서로게이트 값(십진수 값 55357
)과 U+DC36
의 하위 서로게이트 값(십진수 값 56374
)이에요.
Unicode 스칼라 표현
String
값의 Unicode 스칼라 표현에 접근하려면 문자열의 unicodeScalars
속성을 순회하면 됩니다. 이 속성은 UnicodeScalarView
타입으로, UnicodeScalar
타입의 값 컬렉션이에요.
각 UnicodeScalar
에는 스칼라의 21비트 값을 UInt32
값 내에서 반환하는 value
속성이 있습니다.
for scalar in dogString.unicodeScalars { print("\(scalar.value) ", terminator: "") } print("") // 출력 결과: "68 111 103 8252 128054 "
swift
처음 세 개의 UnicodeScalar
값에 대한 value
속성(68
, 111
, 103
)은 다시 한번 D
, o
, g
문자를 나타냅니다.
네 번째 codeUnit
값(8252
)은 16진수 값 203C
의 십진수 표현으로, DOUBLE EXCLAMATION MARK
문자에 대한 Unicode 스칼라 U+203C
를 나타내요.
다섯 번째이자 마지막 UnicodeScalar
의 value
속성인 128054
는 16진수 값 1F436
의 십진수 표현으로, DOG FACE
문자에 대한 Unicode 스칼라 U+1F436
을 나타냅니다.
value
속성을 조회하는 대신, 각 UnicodeScalar
값을 문자열 보간법 등을 사용하여 새로운 String
값을 생성하는 데 사용할 수도 있어요.
for scalar in dogString.unicodeScalars { print("\(scalar) ") } // 출력 결과: // D // o // g // ‼ // 🐶
swift
이렇게 Swift에서는 문자열을 다양한 Unicode 표현으로 다룰 수 있답니다. UTF-8, UTF-16, Unicode 스칼라 표현을 적절히 활용하면 문자열을 효과적으로 처리할 수 있겠죠?