12

我想将西里尔字符串音译为最接近的拉丁语字符串。例如 "матрешка" => "matreshka", "водка" => "伏特加"。因此,理想情况下,我希望在 NSString 或其他已经了解字母表的所有内容并且可以进行对话的地方使用一些现成的方法。

但是,如果 iOS API 中不存在这样的功能,那么我会对 ruby​​ 的tr方法之类的东西感到非常满意,它只是使用指定为参数的简单映射替换字符串中的字符。

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

3 回答 3

19

尝试CFStringTransform使用转换标识符的 CFMutableString 函数kCFStringTransformToLatin或使用简单映射创建 NSString 类别。

由问题海报编辑:更具体地说,它应该是:

NSMutableString *buffer = [@"русский язык" mutableCopy];
CFMutableStringRef bufferRef = (__bridge CFMutableStringRef)buffer;
CFStringTransform(bufferRef, NULL, kCFStringTransformToLatin, false);
NSLog(@"%@", buffer); // outputs "russkij âzyk"
于 2012-04-19T12:43:12.213 回答
6

如果您不需要变音符号或口音,您可以致电CFStringTransform(bufferRef, NULL, kCFStringTransformStripCombiningMarks, false);

附加文章: http: //nshipster.com/cfstringtransform/

于 2013-03-11T12:56:48.563 回答
6

在 Swift 5 中,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 FoundationCFStringTransform(_:_:_:_:)功能:

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
于 2017-08-24T00:45:51.753 回答