Транслитерация/транспонирование символов в NSString
Я хочу транслитерировать кириллицу в ближайший латинский эквивалент. Например. "матрешка" = > "матрешка", "водка" = > "водка". Поэтому в идеале я хочу, чтобы какой-нибудь готовый использовать метод на NSString или где-то еще, который уже знает все о алфавитах и может делать разговор.
Но если такой функции не существует в API iOS, я буду полностью доволен чем-то вроде метода ruby tr, который просто заменяет символы в строке, используя простое сопоставление, указанное как параметр.
"баба".tr('абвгд', 'abvgd')
Ответы
Ответ 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