Transliterate/transpose the characters in the NSString

☆樱花仙子☆ 提交于 2020-01-22 05:51:26

问题


I want to transliterate a cyrillic string to it's closest latin equivalent. E.g. "матрешка" => "matreshka", "водка" => "vodka". So ideally I want some ready to use method on the NSString or somewhere else that already knows everything about the alphabets and can do the conversation.

But if such functionality doesn't exist in the iOS APIs then I will be totally happy with something like ruby's tr method that just replaces the characters in a string using a simple mapping specified as a parameter.

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

回答1:


Either try CFStringTransform function of CFMutableString with kCFStringTransformToLatin transform identifier or make a NSString category with simple mapping.

Edited by the question poster: more specifically it should be:

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



回答2:


If you don't need diacritics or accents you can call CFStringTransform(bufferRef, NULL, kCFStringTransformStripCombiningMarks, false);

Additional article: http://nshipster.com/cfstringtransform/




回答3:


With Swift 5, String has a method called applyingTransform(_:reverse:). applyingTransform(_:reverse:) has the following declaration:

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

The following Playground code shows how to use applyingTransform(_:reverse:) in order to transliterate from cyrillic to latin characters:

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")

As an alternative, you can use Core Foundation CFStringTransform(_:_:_:_:) function:

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


来源:https://stackoverflow.com/questions/10227984/transliterate-transpose-the-characters-in-the-nsstring

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!