1. ホーム
  2. ios

[解決済み] Objective-CとSwiftのURLエンコーディング

2022-05-17 04:43:05

質問

私は NSString をこのようにします。

http://www.

に変換したいのですが。

http%3A%2F%2Fwww.

どうすればいいのでしょうか?

どのように解決するのですか?

欲しい文字をエスケープするのは、もう少し手間がかかります。

コード例

iOS7以上。

NSString *unescaped = @"http://www";
NSString *escapedString = [unescaped stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
NSLog(@"escapedString: %@", escapedString);

NSLogの出力です。

エスケープ文字列: http%3A%2F%2Fwww

URLエンコードに便利な文字セットは以下の通りです。

URLFragmentAllowedCharacterSet  "#%<>[\]^`{|}
URLHostAllowedCharacterSet      "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet  "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet      "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet     "#%<>[\]^`{|}
URLUserAllowedCharacterSet      "#%/:<>?@[\]^`

上記を全て組み合わせたキャラクタセットを作成する。

NSCharacterSet *URLCombinedCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@" \"#%/:<>?@[\\]^`{|}"] invertedSet];

Base64を作成する

Base64キャラクタセットの場合。

NSCharacterSet *URLBase64CharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"/+=\n"] invertedSet];

Swift 3.0に対応。

var escapedString = originalString.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)

<ブロッククオート

Swift 2.xの場合。

var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())

stringByAddingPercentEncodingWithAllowedCharacters は、エンコーディングが必要なUTF-8文字もエンコードします。

iOS7以前はCore Foundationを使用

Core FoundationをARCで使う。

NSString *escapedString = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
    NULL,
   (__bridge CFStringRef) unescaped,
    NULL,
    CFSTR("!*'();:@&=+$,/?%#[]\" "),
    kCFStringEncodingUTF8));

ARCなしでCore Foundationを使用する。

NSString *escapedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
    NULL,
   (CFStringRef)unescaped,
    NULL,
    CFSTR("!*'();:@&=+$,/?%#[]\" "),
    kCFStringEncodingUTF8);

-stringByAddingPercentEscapesUsingEncoding は正しいエンコーディングを生成しません。この場合、同じ文字列を返すものはエンコードされません。

stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding は14文字をエンコードします。

<ブロッククオート

%^{}[]|"<> と、パーセントエスケープされたスペース文字があります。

testStringです。

" `~!@#$%^&*()_+-={}[]|\\:;\"'<,>.?/AZaz"  

エンコードされた文字列です。

"%20%60~!@%23$%25%5E&*()_+-=%7B%7D%5B%5D%7C%5C:;%22'%3C,%3E.?/AZaz"  

注:この文字のセットがあなたのニーズを満たしているかどうかを検討し、そうでない場合は必要に応じて変更してください。

エンコーディングを必要とするRFC 3986の文字 (エンコーディングのプレフィックス文字であるため、% が追加されています)。

"!#$&'()*+,/:;=?@[]%"

一部の"unreserved characters"は追加でエンコードされます。

<ブロッククオート

"\n\r \"%-.<>\^_`{|}~"