2016年3月19日土曜日

入力れた文字をかな変換する(Swift)

テキストボックスに入力された文字をかな変換する機能を実装必要が出てきました。
内容としては、iOS 標準アプリの電話帳とかにある、姓名を漢字で入力したら、よみがなが自動的に入るあの機能です。

ものすごく単純に考えると、入力された値を保持して「かな」に変換してやれば良いかと思ったのですが、部分削除等の操作を考えると、頭が混んがらかってきたので、多分違う方法があるだろうと思って調べてみました。

すると、正にやりたかったことが実装されているページがありましたので参考にさせて頂きました。

[OSX][iOS]読み仮名を得る(Cocoa練習帳)
http://ameblo.jp/bitz/entry-11859904155.html

Objectiive-C で書かれたコードですが、Swift に置き換えても問題なく動作しました。
素晴らしい。

実装内容としては、入力された値をトークナイザーを使用して解析し、ローマー字に変換後、かな変換すると言った物です。
Swift 変換のコードを下に載せておきます。

func kanaHenkan(text: String) -> String {
    let inputText: NSString = text
    let outputText = NSMutableString()

    let range: CFRange = CFRangeMake(0, inputText.length)
    let locale: CFLocaleRef = CFLocaleCopyCurrent()
    let tokenizer: CFStringTokenizerRef
                   = CFStringTokenizerCreate(kCFAllocatorDefault,
                                        inputText as CFStringRef,
                                                           range,
                              kCFStringTokenizerUnitWordBoundary,
                                                           locale)

    var tokenType: CFStringTokenizerTokenType
                   = CFStringTokenizerGoToTokenAtIndex(tokenizer, 0)

    while (tokenType != .None) {
        let latin: CFTypeRef
                   = CFStringTokenizerCopyCurrentTokenAttribute(tokenizer,
                                                                kCFStringTokenizerAttributeLatinTranscription)
        let romanAlphabet: NSString = latin as! NSString
        let furigana = romanAlphabet.mutableCopy()
        CFStringTransform(furigana as! CFMutableString, nil, kCFStringTransformLatinHiragana, false)

        outputText.appendString(furigana as! String)

        tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer)
    }

    return outputText as String
}

メソッド化して、与えた文字列をかな文字で取得するようにしています。
うまく置き換えができるか心配でしたがなんとかできてよかったです。

Written with StackEdit.