🔥 Unicode

418자
5분

Unicode는 다양한 언어의 텍스트를 인코딩, 표현 및 처리하기 위한 국제 표준이에요. 거의 모든 언어의 문자를 표준화된 형식으로 표현할 수 있게 해주며, 외부 소스(예: 텍스트 파일 또는 웹 페이지)에서 해당 문자를 읽고 쓸 수 있죠. Swift의 StringCharacter 타입은 이 섹션에서 설명하는 바와 같이 완벽하게 Unicode를 준수합니다.

Unicode 스칼라 값

Swift의 기본 String 타입은 내부적으로 Unicode 스칼라 값으로 구성되어 있어요. Unicode 스칼라 값은 문자나 수정자에 대한 고유한 21비트 숫자인데요, 예를 들어 LATIN SMALL LETTER A("a")의 경우 U+0061, FRONT-FACING BABY CHICK("🐥")의 경우 U+1F425와 같습니다.

모든 21비트 Unicode 스칼라 값이 문자에 할당되는 것은 아니에요. 일부 스칼라는 향후 할당을 위해 예약되어 있거나 UTF-16 인코딩에 사용되기도 합니다. 문자에 할당된 스칼라 값은 일반적으로 위의 예시처럼 LATIN SMALL LETTER AFRONT-FACING BABY CHICK와 같은 이름도 가지고 있죠.

확장 자소 클러스터

Swift의 Character 타입의 모든 인스턴스는 단일 확장 자소 클러스터를 나타내요. 확장 자소 클러스터는 하나 이상의 Unicode 스칼라 시퀀스로, 결합되면 사람이 읽을 수 있는 단일 문자를 생성합니다.

예를 들어볼게요. 문자 é는 단일 Unicode 스칼라 é(LATIN SMALL LETTER E WITH ACUTE, 또는 U+00E9)로 표현될 수 있어요. 그러나 같은 문자를 표준 문자 e(LATIN SMALL LETTER E 또는 U+0065) 다음에 COMBINING ACUTE ACCENT 스칼라(U+0301)가 오는 스칼라 으로 표현할 수도 있죠. COMBINING ACUTE ACCENT 스칼라는 앞의 스칼라에 그래픽으로 적용되어 Unicode 인식 텍스트 렌더링 시스템에서 렌더링될 때 eé로 바꿉니다.

두 경우 모두 문자 é는 확장 자소 클러스터를 나타내는 단일 Swift Character 값으로 표현돼요. 첫 번째 경우에는 클러스터에 단일 스칼라가 포함되고, 두 번째 경우에는 두 개의 스칼라 클러스터죠:

let eAcute: Character = "\\u{E9}"                         // é
let combinedEAcute: Character = "\\u{65}\\u{301}"          // e 다음에 ́
// eAcute는 é, combinedEAcute는 é
swift

확장 자소 클러스터는 많은 복잡한 스크립트 문자를 단일 Character 값으로 유연하게 표현할 수 있는 방법이에요. 예를 들어, 한글 음절은 사전 구성되거나 분해된 시퀀스로 표현될 수 있는데요, 이 두 표현 모두 Swift에서 단일 Character 값으로 인정됩니다:

let precomposed: Character = "\\u{D55C}"                  // 한
let decomposed: Character = "\\u{1112}\\u{1161}\\u{11AB}"   // ᄒ, ᅡ, ᆫ
// precomposed는 한, decomposed도 한
swift

확장 자소 클러스터를 사용하면 다른 Unicode 스칼라를 단일 Character 값의 일부로 둘러싸는 둘러싸는 표시(COMBINING ENCLOSING CIRCLE 또는 U+20DD 등)에 대한 스칼라를 사용할 수 있어요:

let enclosedEAcute: Character = "\\u{E9}\\u{20DD}"
// enclosedEAcute는 é⃝
swift

지역 표시기 기호에 대한 Unicode 스칼라는 REGIONAL INDICATOR SYMBOL LETTER U(U+1F1FA)와 REGIONAL INDICATOR SYMBOL LETTER S(U+1F1F8)의 조합과 같이 쌍으로 결합하여 단일 Character 값을 만들 수 있습니다:

let regionalIndicatorForUS: Character = "\\u{1F1FA}\\u{1F1F8}"
// regionalIndicatorForUS는 🇺🇸
swift

이렇게 Unicode는 다양한 언어의 문자를 표현하고 처리하는 데 있어 매우 강력하고 유연한 표준이랍니다. Swift에서는 StringCharacter 타입을 통해 이를 완벽히 지원하고 있으니, Unicode의 장점을 잘 활용할 수 있겠죠?