まずは日本語ドメインは無視して、単純なエンコードとデコード。
Objective-C
// エンコード
NSString *encodeOriginal = @"エンコードしたい文字列です";
NSString *endcode = [encodeOriginal stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]];
NSLog(@"%@", endcode);
// -> %E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E3%81%97%E3%81%9F%E3%81%84%E6%96%87%E5%AD%97%E5%88%97%E3%81%A7%E3%81%99
NSString *encodeOriginalUrl = @"https://ja.wikipedia.org/wiki/でんぱ組.inc";
NSString *encodeUrl = [encodeOriginalUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]];
NSLog(@"%@", encodeUrl);
// -> https%3A%2F%2Fja%2Ewikipedia%2Eorg%2Fwiki%2F%E3%81%A7%E3%82%93%E3%81%B1%E7%B5%84%2Einc
// デコード
NSString *decode = [endcode stringByRemovingPercentEncoding];
NSLog(@"%@", decode);
// -> エンコードしたい文字列です
NSString *decodeUrl = [encodeUrl stringByRemovingPercentEncoding];
NSLog(@"%@", decodeUrl);
// -> https://ja.wikipedia.org/wiki/でんぱ組.inc
"stringByAddingPercentEncodingWithAllowedCharacters"はiOS7から使えるメソッドで、一発でエンコードできました。
日本語を含むURLエンコード、デコード
これには致命的な問題があって、(当然ながら)URL全体をエンコードしてしまうときちんとしたURLとしては認識してくれないんですよね。
https://ja.wikipedia.org/wiki/でんぱ組.inc
の場合、"でんぱ組"のところだけエンコードしたい、という時ありますよね。
もちろん、":"や"/"などはそのままにして、日本語だけをエンコードしたい。
分割するのもいいんですが、なかなか大変でスパッとやりたい。
そういう時にはこのカテゴリを使うのが良さげ。
うまいことエンコードしてくれるカテゴリ。
NSStringPunycodeAdditions.h/m
をプロジェクトに追加して、importすればOK。
クエリーのエンコードはこんな風にきちんとしてくれます。
Objective-C
// エンコードしたい時は"encodedURLString"を使う
NSString *encodeOriginalUrl = @"https://ja.wikipedia.org/wiki/でんぱ組.inc";
NSString *encodeUrl = [encodeOriginalUrl encodedURLString];
NSLog(@"%@", encodeUrl);
// -> https://ja.wikipedia.org/wiki/%E3%81%A7%E3%82%93%E3%81%B1%E7%B5%84.inc
逆のデコードの場合はこちら。
Objective-C
// デコードしたい時は"decodedURLString"を使う
NSString *decodeUrl = [encodeUrl decodedURLString];
NSLog(@"%@", decodeUrl);
// -> https://ja.wikipedia.org/wiki/でんぱ組.inc
日本語ドメインにも対応していました。
Objective-C
NSString *encodeOriginalUrl = @"http://お名前.com";
NSString *encodeUrl = [encodeOriginalUrl encodedURLString];
NSLog(@"%@", encodeUrl);
// -> http://xn--t8jx73hngb.com
NSString *decodeUrl = [encodeUrl decodedURLString];
NSLog(@"%@", decodeUrl);
// -> http://お名前.com
※こちらの記事を参考に書いてみました
日本語ドメイン or クエリ付きURLを変換する