🔥 문자열의 Unicode 표현

602자
7분

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) 값의 컬렉션이에요.

lecture image

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) 값의 컬렉션입니다.

lecture image

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 값(5535756374)은 DOG FACE 문자의 UTF-16 서로게이트 쌍(surrogate pair) 표현입니다. 이 값들은 U+D83D의 상위 서로게이트 값(십진수 값 55357)과 U+DC36의 하위 서로게이트 값(십진수 값 56374)이에요.

Unicode 스칼라 표현

String 값의 Unicode 스칼라 표현에 접근하려면 문자열의 unicodeScalars 속성을 순회하면 됩니다. 이 속성은 UnicodeScalarView 타입으로, UnicodeScalar 타입의 값 컬렉션이에요.

UnicodeScalar에는 스칼라의 21비트 값을 UInt32 값 내에서 반환하는 value 속성이 있습니다.

lecture image

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를 나타내요.

다섯 번째이자 마지막 UnicodeScalarvalue 속성인 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 스칼라 표현을 적절히 활용하면 문자열을 효과적으로 처리할 수 있겠죠?