音译/转置NSString中的字符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了音译/转置NSString中的字符相关的知识,希望对你有一定的参考价值。

我想将一个西里尔字符串音译成最接近拉丁语的字符串。例如。 “матрешка”=>“matreshka”,“водка”=>“伏特加”。理想情况下,我想在NSString或其他已经知道字母表的所有内容并且可以进行对话的其他地方准备好使用方法。

但是如果ios API中不存在这样的功能,那么我将完全满意像ruby的tr方法,它只是使用指定为参数的简单映射替换字符串中的字符。

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

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

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

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

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

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

另一答案

使用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

以上是关于音译/转置NSString中的字符的主要内容,如果未能解决你的问题,请参考以下文章

PHP 中的西里尔字母音译

PHP 中的西里尔字母音译

NSString 中的必需字符替换为编码变量

如何将html代码附加到iphone中的NSString变量

如何在 c# 中将字符串从 utf8 转换(音译)为 ASCII(单字节)?

对列名排序后转置和添加前缀的宏