ユーザが入力した文字列などをURLエンコードしてサーバにPOSTすることはよくあると思います。
iOS 7.0 からNSStringに下記のカテゴリメソッドが追加され、Core Foundationの関数を使う必要がなくなり便利になりました。
func stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacters: NSCharacterSet) -> String?
日本語をエンコードする際の罠
このメソッドを使って日本語文字列をエンコードする場合、注意が必要です。
マルチバイト言語の扱いに問題があるようで、1,000文字程度の日本語をエンコードすると、EXC_BAD_ACCESSの例外が発生し、アプリがクラッシュします。
対処方法
非常に残念なのですが、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