티스토리 뷰
1. Canonical Mapping
유니코드에는 canonical equivalence라는 것이 존재한다.
canonical equivalence란, 한 가지의 추상적인(abstract) 문자를 나타내는 문자나
문자열 사이의 기본적인 동등함(fundamental equivalency)을 말하며,
올바르게 표시되었을 때는 똑같이 표현되고 동작해야 한다.
한 문자에 대해 여러 가지 canonical equivalence가 존재하는 것도 가능하다.
예를 들어 문자 Ç(U+00C7)와 문자열 C(U+0043) + ◌̧(U+0327)는
서로 같은 추상적인 문자를 나타내므로 canonical equivalence이고,
문자 Ω(U+03A9)와 문자 Ω(U+2126)은 서로 똑같은 추상적인 문자를 나타내므로 canonical equivalence이다.
이 canonical equivalence를 정의한 매핑을 canonical mapping이라고 한다.
예를 들어 문자 Ç에는 canonical mapping으로 C + ◌̧이 정의돼 있으며,
Ω(U+2126)에는 canonical mapping으로 Ω(U+03A9)이 정의돼 있다.
이 canonical equivalence와 canonical mapping은
유니코드 정규화(Unicode normalization) 처리에 중요한 역할을 한다.
유니코드 정규화는 한 가지의 추상적인 문자를 표현하는 데 쓰인 여러 가지의
canonical equivalence들을 정리해 모두 같은 형태로 변환한다.
예를 들어, Ç와 C + ◌̧가 같이 포함된 문자열에 유니코드 정규화 처리를 하면,
정규화 알고리즘에 따라 Ç와 C + ◌̧가 모두 Ç 또는 C + ◌̧ 둘 중 한 가지 형태로만 변환된다.
두 문자 이상으로 이루어진 문자열(예: C + ◌̧)이 아니라
한 문자(singleton)로만 이루어졌을 경우는 정규화 알고리즘의 종류에 상관없이 모두 같은 문자로 변환된다.
예를 들어 Ω(U+2126)과 Ω(U+03A9)가 같이 포함된 문자열에 유니코드 정규화 처리를 하면 모두 Ω(U+03A9)로 변환된다.
2. iOS 에서 Canonical Mapping 이 필요한 곳
fileManager 를 통해 directory 의 파일 이름들을 가져올 때 흔히
contentsOfDirectoryAtPath: 를 사용한다.
NSArray<NSString *> *subFiles = [fm contentsOfDirectoryAtPath:_model.bundlePath error:&error];
이때 반환되는 NSArray 는 파일의 full path 가 아닌 파일이름들의 Array 인데,
한글 파일이 저장되어 있었다면 Canonical Mapping 이 적용되어 분해된 유니코드 글자형태로 저장되어 있다.
예를들어, "한글파일.txt" 로 파일을 저장했다면
위 subFiles 에 들어있는 파일이름은 "ㅎㅏㄴㄱㅡㄹㅍㅏㅇㅣㄹ.txt" 이다.
즉, 위 코드에서 아래와 같이 동등비교를 실행하면 Fail 처리된다.
for (NSString *fileName in subFiles) {
if ([fileName isEqual:@"한글파일.txt"]) {
} else {
//여기로 진입!
}
}
3. iOS 가 canonical mapping 을 지원하는 방식 ( composed, decomposed )
<Foundation/NSString.h>
@property (readonly, copy) NSString *decomposedStringWithCanonicalMapping;
@property (readonly, copy) NSString *precomposedStringWithCanonicalMapping;
decomposedStringWithCanonicalMapping 은 Canonical Mapping 을 적용하여 String 을 분해한다.
precomposedStringWithCanonicalMapping 은 Canonnical Mapping 이 적용되어 분해된 String 을 다시 조합해준다.
즉, 위의 경우에서 올바른 한글 파일 비교를 위해서는 precomposedString 을 사용해야한다.
for (NSString *fileName in subFiles) {
if ([fileName.precomposedStringWithCanonicalMapping isEqual:@"한글파일.txt"]) {
//여기로 진입!
} else {
}
}
출처 및 참고자료
http://scaleup.tistory.com/55
http://johotogoshinentai.tistory.com/71
'iOS 개발 > iOS' 카테고리의 다른 글
[iOS] KeyChain 을 이용한 데이터 보호 및 앱 간 공유 (0) | 2016.11.25 |
---|---|
[iOS] Background Task 만들기 (iOS 에서 지원하는 방식, 지원하지 않는 방식) (0) | 2016.11.24 |
[iOS] CoreData 의 기본적인 개념, 사용시점, 작동 방식 (2) | 2016.11.21 |
UIView 의 frame, bound 및 Point Contain, Point Convert (0) | 2016.11.16 |
[iOS] UIDocumentInteractionController, UIActivityViewController 의 사용 (0) | 2016.11.15 |
- Total
- Today
- Yesterday
- Swift 3
- 읽기 좋은 코드가 좋은 코드다
- Arc
- dictionary
- ios
- UIView
- AWS
- 꺼내먹어요
- Block
- coredata
- Swift 3.0
- NSManagedObjectModel
- NSManagedObject
- RunLoop
- set
- EffectiveObjectiveC
- optional
- thread
- delegate
- Swift3
- applicationWillResignActive
- workerThread
- Swfit
- CIImage
- docker
- CGImage
- Swift
- NSManagedObjectContext
- HTTP
- string
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |