LoginSignup
1
1

More than 5 years have passed since last update.

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

Posted at

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

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

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1