我想将一个西里尔字符串音译为最接近拉丁语的字符串。例如。 “матрешка”=> “matreshka”,“водка”=> “伏特加”。理想情况下,我想要在NSString或其他已经知道字母表的所有内容的地方准备好使用方法,并且可以进行对话。
但是如果iOS API中不存在这样的功能,那么我将非常满意像ruby的 tr 方法,它只是使用指定为参数的简单映射替换字符串中的字符
"баба".tr('абвгд', 'abvgd')
答案 0 :(得分:19)
使用CFStringTransform
变换标识符尝试CFMutableString的kCFStringTransformToLatin
函数,或者使用简单映射创建NSString类别。
问题海报编辑:更具体地说应该是:
NSMutableString *buffer = [@"русский язык" mutableCopy];
CFMutableStringRef bufferRef = (__bridge CFMutableStringRef)buffer;
CFStringTransform(bufferRef, NULL, kCFStringTransformToLatin, false);
NSLog(@"%@", buffer); // outputs "russkij âzyk"
答案 1 :(得分:6)
如果您不需要变音符号或重音符号,可以拨打CFStringTransform(bufferRef, NULL, kCFStringTransformStripCombiningMarks, false);
答案 2 :(得分:4)
使用Swift 4.2和iOS 12,String
有一个名为applyingTransform(_:reverse:)
的方法。 applyingTransform(_:reverse:)
有以下声明:
func applyingTransform(_ transform: StringTransform, reverse: Bool) -> String?
以下Playground代码显示了如何使用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