Подтвердить что ты не робот

Транслитерация/транспонирование символов в NSString

Я хочу транслитерировать кириллицу в ближайший латинский эквивалент. Например. "матрешка" = > "матрешка", "водка" = > "водка". Поэтому в идеале я хочу, чтобы какой-нибудь готовый использовать метод на NSString или где-то еще, который уже знает все о алфавитах и ​​может делать разговор.

Но если такой функции не существует в API iOS, я буду полностью доволен чем-то вроде метода ruby ​​ tr, который просто заменяет символы в строке, используя простое сопоставление, указанное как параметр.

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

Ответ 1

Попробуйте CFStringTransform функцию CFMutableString с идентификатором преобразования 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")

В качестве альтернативы вы можете использовать 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