티스토리 뷰


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





공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함