2012年9月21日 金曜日 HOME > Objective-C
iOS6でCFStringTransform周りの挙動が変わった

iOS6で不具合に悩まされている人も多いかと思います。私もその一人です。
CFStringTransformは、文字列を全角から半角に変えたり、カタカナを平仮名に変えたりと、様々なオプションによって文字列の相互変換に使え大変便利です。
ところが、iOS6ではその挙動がおかしいというか、掴めません。
問題部分を小さくまとめたプログラム
iPhone5という文字列を全角にして、また半角に戻すという内容です。
NSMutableString *hoge = [[NSMutableString alloc] initWithFormat:@"iPhone5"];
//1: hogeを全角に変換
if(!CFStringTransform((CFMutableStringRef)hoge, NULL, kCFStringTransformFullwidthHalfwidth, YES))
{
NSLog(@"1: error!");
}
NSLog(@"%@", hoge);
//2: 更にhogeを半角に変換
if(!CFStringTransform((CFMutableStringRef)hoge, NULL, kCFStringTransformFullwidthHalfwidth, NO))
{
NSLog(@"2: error!");
}
NSLog(@"%@", hoge);//ここで結果が変わる
[hoge release];
求める結果は、8行目でiPhone5、15行目でiPhone5という出力。
ところが、iOS6では2回目の実行で半角に戻りません。2回ともiPhone5と出力されます。error!とも出力されていないので、実行内容自体は問題ないのではと考えています。
kCFStringTransformFullwidthHalfwidth というオプションに限らず、他でも一度変換すると再度適用すると反映されないといった、似た現象を確認しています。
これがバグなのか仕様ななのかもわかっていません。
もし使い方が間違っているよ!とか、こういう解決策があるよ!と言う方は、よろしければ、@dice_sまでお願いします。