在開發中文應用的過程中,有時會與到需要將漢字轉爲拼音的需求,在網上搜索一下會發現不少這樣的庫,這些庫的實現多數是通過查表的方式,而且實現比較複雜,使用和維護不是很方便。其實,作爲幸福的Cocoa開發者,這項功能已經再Core Foundation的類庫中提供了,並且可以處理多種文字的轉譯,廢話少說,下面是代碼:
1
2
3
4
| NSMutableString *string = [@"你好" mutableCopy];
NSLog(@"Before: %@", string); // Before: 你好
CFStringTransform((__bridge CFMutableStringRef)string, NULL, kCFStringTransformMandarinLatin, NO);
NSLog(@"After: %@", string); // After: nǐ hǎo
|
這裏使用的是CFStringTransform這個函數,函數的簽名如下:
1
2
3
4
5
6
| Boolean CFStringTransform (
CFMutableStringRef string,
CFRange *range,
CFStringRef transform,
Boolean reverse
);
|
四個參數分別代表:待轉換的字符串(string
),轉換的範圍(range
),轉換的選項(transform
),是否逆向轉換(reverse
)。漢字轉拼音的關鍵就在於第三個參數transform
常量,我們這裏使用的是kCFStringTransformMandarinLatin
這個選項,對於處理其它的語言可以使用對應的選項,文檔中有所有選項的說明。
你會發現上面的轉換結果是帶拼音聲調標記的,但是有時候我們並不需要音標,對於這樣的需求,我們可以用另一個transform
選項kCFStringTransformStripDiacritics
進行處理:
1
2
3
4
5
6
| 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的文檔中或許就已經有優雅的解決辦法了。