Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift string replace occurrences

Tags:

ios

swift

I want to replace some character occurrences with english letters using Swift. Replace code:

let turkish = ["ı", "ğ", "ü", "ş", "ö", "ç"]
let english = ["i", "g", "u", "s", "o", "c"]

var city = "Ağri"
var result = ""

for i in 0..<turkish.count {
    var target = turkish[i]
    var destination = english[i]

    result = city.stringByReplacingOccurrencesOfString(target, withString: destination, options: NSStringCompareOptions.CaseInsensitiveSearch | NSStringCompareOptions.LiteralSearch, range: nil)
}

It does not replace "ğ" with "g". What's strange is that, if I type it directly like this:

result = city.stringByReplacingOccurrencesOfString("ğ", withString: "g", options: NSStringCompareOptions.CaseInsensitiveSearch | NSStringCompareOptions.LiteralSearch, range: nil)

it works perfectly fine.

Why doesn't it, when I first assign the value to a String variable?

like image 433
aymeba Avatar asked Dec 10 '22 23:12

aymeba


1 Answers

It looks like you are trying to remove a variety of accents and diacritics. One way that you can do that is using CFStringTransform.

In Swift it would look something like this:

let original = "šÜįéïöç"
var mutableString = NSMutableString(string: original) as CFMutableStringRef
CFStringTransform(mutableString, nil, kCFStringTransformStripCombiningMarks, Boolean(0))

let normalized = (mutableString as NSMutableString).copy() as! NSString
// = sUieioc

Edit

As was pointed out by Martin R in the comments. You can do the same without Core Foundation:

let original = "šÜįéïöç"
let normalized = original.stringByFoldingWithOptions(.DiacriticInsensitiveSearch, locale: NSLocale.currentLocale())
// = sUieioc
like image 96
David Rönnqvist Avatar answered Dec 29 '22 10:12

David Rönnqvist