Posted at

日本語ドメイン、クエリー付きのURLをエンコード・デコードする

More than 3 years have passed since last update.

まずは日本語ドメインは無視して、単純なエンコードとデコード。


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 の場合、"でんぱ組"のところだけエンコードしたい、という時ありますよね。

もちろん、":"や"/"などはそのままにして、日本語だけをエンコードしたい。

分割するのもいいんですが、なかなか大変でスパッとやりたい。

そういう時にはこのカテゴリを使うのが良さげ。

Wevah/Punycode-Cocoa

うまいことエンコードしてくれるカテゴリ。

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を変換する