Transliterate/transpose the characters in the NSString

梦想的初衷 提交于 2019-12-02 21:04:44
ksh

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"

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

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

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