🔥 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 값으로 표현돼요. 첫 번째 경우에는 클러스터에 단일 스칼라가 포함되고, 두 번째 경우에는 두 개의 스칼라 클러스터죠:

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

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

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

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

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

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

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

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

YouTube 영상

채널 보기
미들웨어 vs 가드, 왜 NestJS에서는 가드가 더 똑똑할까? | NestJS 가이드
NestJS 역할 기반 접근 권한 부여 - Guard, Reflector | NestJS 가이드
NestJS 인터셉터에서 map 연산자로 응답을 변환하는 방법 | NestJS 가이드
함수 객체의 보편적 구성 | 프로그래머를 위한 카테고리 이론
변환 파이프로 컨트롤러 코드 깔끔하게 만들기 | NestJS 가이드
NestJS 인터셉터란? | NestJS 가이드
인터셉터와 RxJS로 캐시 시스템 구축하기 | NestJS 가이드
매번 ValidationPipe 복붙하세요? NestJS 전역 파이프로 한 번에 해결하기 | NestJS 가이드