LoginSignup
16

More than 5 years have passed since last update.

日本語文字列のURLエンコード時に潜む罠(iOS7 以上)

Posted at

ユーザが入力した文字列などをURLエンコードしてサーバにPOSTすることはよくあると思います。
iOS 7.0 からNSStringに下記のカテゴリメソッドが追加され、Core Foundationの関数を使う必要がなくなり便利になりました。

func stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacters: NSCharacterSet) -> String?

日本語をエンコードする際の罠

このメソッドを使って日本語文字列をエンコードする場合、注意が必要です。
マルチバイト言語の扱いに問題があるようで、1,000文字程度の日本語をエンコードすると、EXC_BAD_ACCESSの例外が発生し、アプリがクラッシュします。

Screenshot 2015-01-01 17.32.54.png

対処方法

非常に残念なのですが、iOS7以前で使っていたCFURLCreateStringByAddingPercentEscapes()を使います。

func encode(string: String) -> String {
    let charactersToBeEscaped: CFStringRef = ":/?&=;+!@#$()',*"
    return CFURLCreateStringByAddingPercentEscapes(
            nil,
            string,
            nil,
            charactersToBeEscaped,
            CFStringBuiltInEncodings.UTF8.rawValue)
}

検証環境

  • Xcode 6.1.1
  • iOS SDK 8.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
16