2012-04-04 20 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の%のBC%のC5 %BA%C4%87%C4%99%C3%B3%C5%82%C5%84 "

これはOKです。

しかし、私はそれを解読しようとした場合:

NSString* original = decodeFromPercentEscapeString(encoded); 

私が取得: "ńÖŇõŇľŇļńáńô√≥ŇāŇĄ" @。

なぜですか?

URLエンコードされたテキストをデコードする方法はありますか?

答えて

1

-[NSString stringByReplacingPercentEscapesUsingEncoding:]を試しましたか?

また、ブリッジキャストを誤って使用しています。作成された文字列は、ARCが所有していることを知らないため、リークします。 CFBridgingRelease()を使用してください。これはCFRelease()の変種であり、通常はCore Foundationの "Create"関数のバランスをとるのに必要ですが、ARCと協調しているのでいいです。

+0

はい、あります。同じことが起こります。しかし、ブリッジの先端のキャストはありがとう。 – myszon

+0

私はいくつかの他の問題がなければならないと思います。 $ python >>> CoreFoundation import * >>> CFURLCreateStringByReplacingPercentEscapesUsingEncoding(なし、% "%C4%85%C5%9B%C5%BC");コード化された文字列を使用するだけで、Pythonで簡単にテストできます。 \ xc4 \ x85 \ xc5 \ x9b \ x9 \ x9b \ x9b \ x9b \ x9b \ xc5 \ xbc \ xc5 \ xba \ xc4 \ x87 \ xc4 \ x99 \ xc3 \ xb3 \ xc5 \ x82 \ xc5 \ x84 ' –

+0

はい、しかし、何らかの理由で1文字として扱われるべきバイトのペアがあるかのように見えます二人として扱われる。 \ xc4 \ x85という意味は、± – myszon

関連する問題