Home 寫程式[iOS] Swift – 五十音排序

[iOS] Swift – 五十音排序

by 艾普利

Swift 的String 是 Unicode String 因此使用Sort(by:) 時自然是使用Unicode 排序

這樣的好處是無論是什麼樣的文字,找得到Unicode 編碼就可以排序

什麼是Unicode?

Unicode是一種文字編碼方式,常見的有UTF-8 與 UTF-16,最顯而易見的差別在於位元數的不同
由於Unicode幾乎包含所有文字,因此在Swift 裡基本上所以文字都可以使用 Sort(by:)來排序

但是問題來了,使用Unicode排序是很方便沒錯,但是卻可能與認知的文字排序不同

就拿專案上遇到的日文字來舉例

由於日文有平假名與片假名,若直接使用Unicode來排序的話,發生 あ < ア 的情況,這是因為Unicode 的編碼中 是排在 的前面,排序的時候自然就會出現 あ < ア的情況,看起來很合理沒什麼問題

但問題在於對於日本人來說 あ = ア 所以它們在順序上是同等的,那該怎麼辨呢?

這時候就請出Google 大神!!! 在 Google 大神的幫忙下有找到了日本開發者寫的方法

Stringクラスにひらがな・カタカナ変換をextensionする

這個解法簡單來說就是先把平假名轉成片假名,或是把片假名轉成平假名之後,再使用Sort 來排序

這樣排出來的就會是完美的五十音順啦~  趕快來試用看看吧…

呃…

ERROR…

研究了一下子,終於發現了問題點,只要改寫成下面這樣就可以了

if char.value >= 0x30A1 && char.value <= 0x30F6 {
	if let code = UnicodeScalar(char.value - 96) {
    	hiragan.append(Character(code))
    } else {
    	hiragan.append(Character(code))
    }
}

主要原因

是現在的(Swift 5) append只有提供這些方式

因此Github中原本使用的方式就不能用了,已經不能直接把UnicodeScalar加到String裡,必需要轉成Character之後才能丟進去

把轉換method改寫完之後,就可以排出 あ = ア 的五十音排序了

You may also like