Cocoa 漢字轉拼音最簡單的方法

在開發中文應用的過程中,有時會與到需要將漢字轉爲拼音的需求,在網上搜索一下會發現不少這樣的庫,這些庫的實現多數是通過查表的方式,而且實現比較複雜,使用和維護不是很方便。其實,作爲幸福的 Cocoa 開發者,這項功能已經再 Core Foundation 的類庫中提供了,並且可以處理多種文字的轉譯,廢話少說,下面是代碼:

NSMutableString *string = [@"你好" mutableCopy];
NSLog(@"Before: %@", string); // Before: 你好
CFStringTransform((__bridge CFMutableStringRef)string, NULL, kCFStringTransformMandarinLatin, NO);
NSLog(@"After: %@", string); // After: nǐ hǎo   

這裏使用的是 CFStringTransform 這個函數,函數的簽名如下:

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

四個參數分別代表:待轉換的字符串(string),轉換的範圍(range),轉換的選項(transform),是否逆向轉換(reverse)。漢字轉拼音的關鍵就在於第三個參數transform常量,我們這裏使用的是 kCFStringTransformMandarinLatin 這個選項,對於處理其它的語言可以使用對應的選項,文檔中有所有選項的說明。

你會發現上面的轉換結果是帶拼音聲調標記的,但是有時候我們並不需要音標,對於這樣的需求,我們可以用另一個 transform 選項 kCFStringTransformStripDiacritics 進行處理:

   NSMutableString *string = [@"你好" mutableCopy];
   NSLog(@"Before: %@", string); // Before: 你好
   CFStringTransform((__bridge CFMutableStringRef)string, NULL, kCFStringTransformMandarinLatin, NO);
   NSLog(@"After: %@", string);  // After: nǐ hǎo  
   CFStringTransform((__bridge CFMutableStringRef)string, NULL, kCFStringTransformStripDiacritics, NO);
   NSLog(@"Striped: %@", string); // Striped: ni hao

總結

Cocoa類庫經過20幾年的發展,已經是一個十分成熟的類庫,你總會發現它能用很少代碼實現意想不到的功能,所以有時候不要急於發明輪子,Cocoa的文檔中或許就已經有優雅的解決辦法了。