【问题标题】:Transliterate/transpose the characters in the NSString音译/转置 NSString 中的字符
【发布时间】:2012-04-19 12:22:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios objective-c iphone nsstring transliteration


    【解决方案1】:

    要么尝试 CFMutableString 的 CFStringTransform 函数和 kCFStringTransformToLatin 转换标识符,要么使用简单映射创建一个 NSString 类别。

    由问题发布者编辑:更具体地说应该是:

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

    【讨论】:

    • Ай красавчег!! ))
    【解决方案2】:

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

    补充文章:http://nshipster.com/cfstringtransform/

    【讨论】:

      【解决方案3】:

      在 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 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
      

      【讨论】:

      • 正如您的link 所说,applyTransform(_:reverse:) 方法适用于 ios 9+。在 ios 10.2 上测试没有任何问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多