2012-04-04 3 views
1

URLEncoded 인 서버에서 보낸 일부 텍스트의 디코딩을 시도하고 있으며 이것이 내가 관리 할 수있는 최상의 방법입니다.디코딩 URL 인코딩되지 않은 비표준 문자

나는 URLEncododing 이러한 표준 기능을 사용

NSString* encodeToPercentEscapeString(NSString *string) { 
    return (__bridge NSString *) 
    CFURLCreateStringByAddingPercentEscapes(NULL, 
             (__bridge CFStringRef) string, 
             NULL, 
             (CFStringRef) @"!*'();:@&=+$,/?%#[]", 
             kCFStringEncodingUTF8); 
} 

NSString* decodeFromPercentEscapeString(NSString *string) { 
    return (__bridge NSString *) 
    CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, 
                 (__bridge CFStringRef) string, 
                 CFSTR(""), 
                 kCFStringEncodingUTF8); 
} 

나는 특수 문자 인코딩하는 경우 : 내가 얻을

NSString* encoded = encodeToPercentEscapeString(@"ąśżźćęółń"); 

@ "%의 C4 %의 85 % C5 %의 9B %의 C5 %의 기원전 % C5 % BA % C4 % 87 % C4 % 99 % C3 % B3 % C5 % 82 % C5 % 84 "

괜찮 으면. 나는 그것을 해독하려고하면

는하지만 :

NSString* original = decodeFromPercentEscapeString(encoded); 

를 내가 얻을 : @ "ńÖŇõŇľŇļńáńô√≥ŇāŇĄ을".

왜?

URLEncoded 텍스트를 디코딩하는 더 좋은 방법이 있습니까?

답변

1

-[NSString stringByReplacingPercentEscapesUsingEncoding:]을 사용해 보셨습니까?

또한 브리징 캐스트를 잘못 사용하고 있습니다. 생성 된 문자열은 ARC가 소유하고 있기 때문에 누출됩니다. CFBridgingRelease()를 사용하십시오. 왜냐하면 그것은 CFRelease()의 변종이기 때문에 일반적으로 Core Foundation "Create"함수의 균형을 유지하는 데 필요하지만 ARC와 협력하기 때문에 좋습니다.

+0

예, 있습니다. 같은 일이 일어난다. 다리 위의 팁을 주셔서 고마워한다. – myszon

+0

다른 문제가 있다고 생각합니다. 인코딩 된 문자열 만 사용하여 파이썬에서의 빠른 테스트 결과 올바른 출력을 보여줍니다. $ python >>> CoreFoundation 가져 오기 * >>> CFURLCreateStringByReplacingPercentEscapesUsingEncoding (없음, "% C4 % 85 % C5 % 9B % C5 % BC \ xc4 \ x85 \ xc5 \ x9b \ uc2 \ uc2 \ uc2 \ uc2 \ uc2 \ uc2 " xc5 \ xbc \ xc5 \ xba \ xc4 \ x87 \ xc4 \ x99 \ xc3 \ xb3 \ xc5 \ x82 \ xc5 \ x84 ' –

+0

예,하지만 어떤 이유로 한 문자로 처리해야하는 바이트 쌍이 2로 취급됩니다. that \ xc4 \ x85는 ± – myszon