iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
漢字混じりの日本文の読み仮名を得るサンプルコードを作ってみた。
- (IBAction)doRuby:(id)sender
{
/* テキストフィールドから日本文を読み取る */
NSString *inputText = self.inputTextField.stringValue;
NSMutableString *outputText = [[NSMutableString alloc] init];
CFRange range = CFRangeMake(0, [inputText length]);
CFLocaleRef locale = CFLocaleCopyCurrent();
/* トークナイザーを作成 */
CFStringTokenizerRef tokenizer = CFStringTokenizerCreate(kCFAllocatorDefault,
(CFStringRef)inputText,
range,
kCFStringTokenizerUnitWordBoundary,
locale);
/* 最初の位置に */
CFStringTokenizerTokenType tokenType = CFStringTokenizerGoToTokenAtIndex(tokenizer, 0);
/* 形態素解析 */
while (tokenType != kCFStringTokenizerTokenNone) {
range = CFStringTokenizerGetCurrentTokenRange(tokenizer);
/* ローマ字を得る */
CFTypeRef latin = CFStringTokenizerCopyCurrentTokenAttribute(tokenizer,
kCFStringTokenizerAttributeLatinTranscription);
NSString *romaji = (__bridge NSString *)latin;
NSString *token = [inputText substringWithRange:NSMakeRange(range.location, range.length)];
/* 平仮名に変換 */
NSMutableString *furigana = [romaji mutableCopy];
CFStringTransform((CFMutableStringRef)furigana, NULL, kCFStringTransformLatinHiragana, false);
[outputText appendString:furigana];
DBGMSG(@"%s token(%@) latin(%@) furigana(%@)" ,__func__, token, latin, furigana);
CFRelease(latin);
tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer);
}
CFRelease(tokenizer);
CFRelease(locale);
/* レベルに読み仮名を設定する */
[self.outputLabel setStringValue:outputText];
}