2015年2月2日月曜日

[iOS][Objective-C]文字列の各種変換


どうも。

文字列の各種変換。
全角→半角とか、
ひらがな→カタカナとか、
ローマ字→ひらがなとか。

普段あんまり必要としない機能というか、
ついぞ最近になってやりたいシーンが出てきて、
調べてみたら...。

NSStringには該当するメソッドはありませんが、
CFMutableStringに行き着きました。
で、CFStringTransform関数というのを使えばいいみたい。
定義を覗いてみると。

[CFStringTransform関数]

CF_EXPORT
Boolean CFStringTransform(CFMutableStringRef string, CFRange *range, CFStringRef transform, Boolean reverse);

[transform]

/* Transform identifiers for CFStringTransform()
*/
CF_EXPORT const CFStringRef kCFStringTransformStripCombiningMarks;
CF_EXPORT const CFStringRef kCFStringTransformToLatin;
CF_EXPORT const CFStringRef kCFStringTransformFullwidthHalfwidth;
CF_EXPORT const CFStringRef kCFStringTransformLatinKatakana;
CF_EXPORT const CFStringRef kCFStringTransformLatinHiragana;
CF_EXPORT const CFStringRef kCFStringTransformHiraganaKatakana;
CF_EXPORT const CFStringRef kCFStringTransformMandarinLatin;
CF_EXPORT const CFStringRef kCFStringTransformLatinHangul;
CF_EXPORT const CFStringRef kCFStringTransformLatinArabic;
CF_EXPORT const CFStringRef kCFStringTransformLatinHebrew;
CF_EXPORT const CFStringRef kCFStringTransformLatinThai;
CF_EXPORT const CFStringRef kCFStringTransformLatinCyrillic;
CF_EXPORT const CFStringRef kCFStringTransformLatinGreek;
CF_EXPORT const CFStringRef kCFStringTransformToXMLHex;
CF_EXPORT const CFStringRef kCFStringTransformToUnicodeName;
CF_EXPORT const CFStringRef kCFStringTransformStripDiacritics CF_AVAILABLE(10_5, 2_0);

CFStringTransform関数に対して、
定義されたtransformを指定してやると、
そのように変換してくれる。

再利用性と、
CFのコードをなるべく書かなくていいように、
必要そうな分をピックアップしてNSStringのカテゴリにしてみた。

[NSString+ConvertLetters.h]

@interface NSString (ConvertLetters)

- (NSString *)convertToFullwidth;
- (NSString *)convertToHalfwidth;
- (NSString *)convertKatakanaToHiragana;
- (NSString *)convertHiraganaToKatakana;
- (NSString *)convertHiraganaToRoman;
- (NSString *)convertRomanToHiragana;
- (NSString *)convertKatakanaToRoman;
- (NSString *)convertRomanToKatakana;

@end

[NSString+ConvertLetters.m]

- (NSString *)transformWith:(CFStringRef)transform reverse:(Boolean)reverse {
 
    NSMutableString* retStr = [[NSMutableString alloc] initWithString:self];
    CFStringTransform((__bridge CFMutableStringRef)retStr, NULL, transform, reverse);
 
    return retStr;
}

- (NSString *)convertToFullwidth {
 
    return [self transformWith:kCFStringTransformFullwidthHalfwidth
                       reverse:true];
}







みたいな感じ。


それでは。
ちゃお☆


まこぴー。