2012-04-19 25 views
10

我想將西里爾字符串音譯爲與其最接近的拉丁等效字符串。例如。 「матрешка」=>「matreshka」,「водка」=>「伏特加酒」。所以理想情況下,我想要一些準備好在NSString或其他地方使用方法,這些方法已經知道字母的所有內容,並且可以進行對話。音譯/轉置NSString中的字符

但是,如果iOS API中不存在這樣的功能,那麼我將完全滿意於類似ruby的tr方法,該方法僅使用指定爲參數的簡單映射替換字符串中的字符。

"баба".tr('абвгд', 'abvgd') 

回答

19

要麼試圖CFMutableString的CFStringTransform函數kCFStringTransformToLatin變換標識符或作出的NSString類別與簡單的映射。

對這個問題的海報編輯:更具體地說,它應該是:

NSMutableString *buffer = [@"русский язык" mutableCopy]; 
CFMutableStringRef bufferRef = (__bridge CFMutableStringRef)buffer; 
CFStringTransform(bufferRef, NULL, kCFStringTransformToLatin, false); 
NSLog(@"%@", buffer); // outputs "russkij âzyk" 
+1

Айкрас вчег! )) – korgx9 2016-10-21 09:59:27

3

使用Swift 4和iOS 11時,String有一個名爲applyingTransform(_:reverse:)的方法。 applyingTransform(_:reverse:)有如下聲明:

func applyingTransform(_ transform: StringTransform, reverse: Bool) -> String? 

下面的遊樂場代碼演示瞭如何才能從西裏爾字母音譯爲拉丁字符使用applyingTransform(_:reverse:):如果需要的話,你

import Foundation 

let string = "матрешка" 
let latinString = string.applyingTransform(StringTransform.toLatin, reverse: false) 
let noDiacriticString = latinString?.applyingTransform(StringTransform.stripDiacritics, reverse: false) 

print(latinString) // prints: Optional("matreška") 
print(noDiacriticString) // prints: Optional("matreska") 

作爲替代,可以使用Core Foundation CFStringTransform(_:_:_:_:)功能:

import Foundation 

let mutableString = NSMutableString(string: "матрешка") 

CFStringTransform(mutableString, nil, kCFStringTransformToLatin, false) 
print(mutableString) // prints: matreška 

CFStringTransform(mutableString, nil, kCFStringTransformStripDiacritics, false) 
print(mutableString) // prints: matreska