일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- window
- darkmode
- stack
- Apple
- Swift
- rxswift
- iOS16
- Xcode
- 웹뷰
- Firebase
- view
- MacOS
- IOS
- Session
- 개발자
- SwiftUI
- 한글
- UIButton
- mac
- FLUTTER
- appstore
- Code
- Archive
- JPA
- error
- Git
- github
- Python
- Realm
- Notification
- Today
- Total
EEYatHo 앱 깎는 이야기
Swift ) 유니코드, 한글, 정규화 - EEYatHo iOS 본문
유니코드로 한글을 표현하는 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)(ᇂ)
- 28개 = ᆧ, ᆨ, ᆩ, ᆪ, ᆫ, ᆬ, ᆭ, ᆮ, ᆯ, ᆰ, ᆱ, ᆲ, ᆳ, ᆴ, ᆵ, ᆶ, ᆷ, ᆸ, ᆹ, ᆺ, ᆻ, ᆼ, ᆽ, ᆾ, ᆿ, ᇀ, ᇁ, ᇂ
초성 중성 종성 구별 용도
- 초성 검색, 초성 정렬, 을/를 구별 등
완성형 <-> 조합형 수식
출처 - https://www.vbflash.net/192
완성형 -> 조합형 (초성, 중성, 종성)
종성 = 완성형 % 28
중성 = ((완성형 - 종성) / 28) % 21
초성 = (((완성형 - 종성) / 28) - 중성) / 21
조합형 -> 완성형
완성형 = (((초성 * 21) + 중성) * 28) + 종성 + 0xAC00
'iOS, Swift > Swift Theory' 카테고리의 다른 글
Swift ) Dynamic Image - EEYatHo iOS (1) | 2022.10.15 |
---|---|
Swift ) 고차함수 - EEYatHo iOS (2) | 2022.09.23 |
Swift ) UserDefaults, KeyChain - EEYatHo iOS (0) | 2022.03.03 |
Swift ) Deferred Deeplink - EEYatHo iOS (0) | 2022.02.22 |
Swift ) requestAuthorization, registerForRemoteNotifications - EEYatHo iOS (0) | 2022.02.15 |