ローマ字と記号は半角、ひらがなとカタカナは全角で表示した〜い、みたいな要件を求められた場合、
CFStringTransform ではなんだかうまくいかなかった。OSのバージョンによって誤変換もあるみたいだし。
仕方ないので…
- (NSString *)hoge:(NSString *)str
{
if([str isEqualToString:@"ガ"]) return @"ガ";
if([str isEqualToString:@"ギ"]) return @"ギ";
…
}
みたいなのを一文字づつダラダラかいた関数を作成して、とりあえずおっけーと思ってたのですが、上記の関数を利用して実際に帰ってきた文字列は
「ガ」「ギ」…ではなくて「カ"」「キ"」でした。
なんで!?
どうやらUTF-8における濁点の全角カタカナは文字コードが異なる2種類の文字があるそうで。こまった。
どうすればいいか
解決方法:Unicodeの正規化というのが必要(Normalize)
NSStringには下記のメソッドが用意されているようです。
各メソッドについての詳細はリファレンスや後述の参考サイトなどにて確認して下さい。。。
– decomposedStringWithCanonicalMapping
– decomposedStringWithCompatibilityMapping
– precomposedStringWithCanonicalMapping
– precomposedStringWithCompatibilityMapping
というわけで…
NSString* str = @"ガ";
NSLog(@"%@",[[self hoge:str] decomposedStringWithCompatibilityMapping]);
無事に「ガ」が出力されました〜。
とりあえず解決はしたが、そもそも根本的な何かがおかしいのかな?
参考サイト
http://homepage1.nifty.com/nomenclator/unicode/normalization.htm
http://akisute.com/2010/05/utf-8-normalize.html