EEYatHo 앱 깎는 이야기

Swift ) 유니코드, 한글, 정규화 - EEYatHo iOS 본문

iOS, Swift/Swift Theory

Swift ) 유니코드, 한글, 정규화 - EEYatHo iOS

EEYatHo 2022. 3. 29. 00:03
반응형


유니코드로 한글을 표현하는 2가지 방법


1. 완성형 (precomposed)

초성,중성,종성 3개를 조합해서 한 글자를 표현

ex. 단 = ㄷ + ㅏ + ㄴ // "\u{1103}\u{1161}\u{11AB}"

 

2. 조합형 (decomposed)

유니코드에 등록된 모든 한글 중, 1개를 골라서 사용

ex. 단 = 단 // "\u{B2E8}"

 

확인하는 방법 : .unicodeScalars

print("단".unicodeScalars)

// 완성형
// - 0 : "\u{B2E8}"  단

// 조합형
// - 0 : "\u{1103}"  ㄷ
// - 1 : "\u{1161}"  ㅏ
// - 2 : "\u{11AB}"  ㄴ

 

 

 

조합형(decomposed)의 문제


기본적으로 스위프트에서 만들어진 문자열들은 완성형으로 되어있음.

하지만, 조합형으로 된 케이스가 존재.

(ex. FileManager를 통해서 파일 이름을 읽어올 때, 조합형으로 읽어옴.)

 

발견한 문제점들

1. 몇몇 커스텀 폰트들은 조합형으로 된 문자를 지원하지 않음.

2. Swift에서 equel연산(완성형 = 조합형)을 했을 때는 같다고 하지만,

    Realm 내부의 filter, equel연산 같은 low 레벨 연산에서는 다르게 인식. 

( + 그외 내가 발견하지 못한 문제들 )

 

 

 

 

유니코드 정규화


1. 완성형 -> 조합형

 

Swift에서 지원하는 프로퍼티로 아래 2가지가 있음.

"사랑해".decomposedStringWithCanonicalMapping // NFD
"사랑해".decomposedStringWithCompatibilityMapping // NFKD

 


2. 조합형 -> 완성형

 

마찬가지로 Swift에서 지원하는 프로퍼티 2가지가 존재함.

"나도".precomposedStringWithCanonicalMapping // NFC
"나도".precomposedStringWithCompatibilityMapping // NFKC

Canonical, Compatibility 의 차이는

유니코드 등가성(Unicode equivalence)..

같은 문자를 다르게 표현하는 방식이 있고..

정준 분해.. 호환 분해.. 

NFD, NFC, NFKD, NFKC..

 

흠.. 열심히 리서칭 해봤는데 아직 명확한 이해가 안됨 😇 ..

이해되면 수정하기로.

 

자세한 설명은 한국위키백과 , 영어위키백과 , 좀더 현실적인 설명글

 

 

 

 

초성, 중성, 종성


      • 초성 
        • 19개 = ㄱ, ㄲ, ㄴ, ㄷ, ㄸ, ㄹ, ㅁ, ㅂ, ㅃ, ㅅ, ㅆ, ㅇ, ㅈ, ㅉ, ㅊ, ㅋ, ㅌ, ㅍ, ㅎ
        • 4352(1100)() ~ 4370(1112)(  // 10진수(16진수)

      • 중성
        • 21개 = ㅏ, ㅐ, ㅑ, ㅒ, ㅓ, ㅔ, ㅕ, ㅖ, ㅗ, ㅘ, ㅙ, ㅚ, ㅛ, ㅜ, ㅝ, ㅞ, ㅟ, ㅠ, ㅡ, ㅢ, ㅣ
        • 4449(1161)() ~ 4469(1175)()

      • 종성
        • 28개 = ᆧ, ᆨ, ᆩ, ᆪ, ᆫ, ᆬ, ᆭ, ᆮ, ᆯ, ᆰ, ᆱ, ᆲ, ᆳ, ᆴ, ᆵ, ᆶ, ᆷ, ᆸ, ᆹ, ᆺ, ᆻ, ᆼ, ᆽ, ᆾ, ᆿ, ᇀ, ᇁ, ᇂ
          * 첫번째는 종성이 없다는 걸 의미. 그냥 안보이는 곳도 있고, 공백인 곳도 있음. Xcode에서는 그냥 안보임
        • 4519(11A7)(ᆧ) ~ 4546(11c2)(ᇂ)

 

초성 중성 종성 구별 용도

  • 초성 검색, 초성 정렬, 을/를 구별 등

 

 

 

완성형 <-> 조합형 수식


출처 - https://www.vbflash.net/192

 

완성형 -> 조합형 (초성, 중성, 종성)

종성 = 완성형 % 28
중성 = ((완성형 - 종성) / 28) % 21
초성 = (((완성형 - 종성) / 28) - 중성) / 21

 

조합형 -> 완성형

완성형 = (((초성 * 21) + 중성) * 28) + 종성 + 0xAC00

 

Comments