[轉(zhuǎn)載]Swift5中CFStringTransform的使用

參考自原文 https://www.dazhuanlan.com/2020/03/11/5e6825c7056da/
原文參考自 https://nshipster.com/cfstringtransform/

名稱按照字母排序,名稱可能為數(shù)字、純中文、純英文、純?nèi)瘴摹⒒蛘吒鞣N語(yǔ)言的混合。
在Swift中可以使用Core Foundation下的CFStringTransform方法轉(zhuǎn)換。

    /// 轉(zhuǎn)換字符串
    /// - Parameter string: 要轉(zhuǎn)的字符串,需是CFMutableString類型
    /// - Parameter range: 要轉(zhuǎn)換的區(qū)間。全部轉(zhuǎn)換可傳入 nil
    /// - Parameter transform: 要應(yīng)用的變換
    /// - Parameter reverse: 是否要反轉(zhuǎn)
    public func (_ string: CFMutableString!, _ range: UnsafeMutablePointer<CFRange>!, _ transform: CFString!, _ reverse: Bool) -> Bool
extension String {
    /// 將任一字符串轉(zhuǎn)換為英文字母字符串
    var pinyin: String {
        let mutableString = NSMutableString(string: self)
        
        // 應(yīng)用 kCFStringTransformToLatin 變換將所有非英文文本轉(zhuǎn)換為拉丁字母表示, 小寫不帶音標(biāo)。
        CFStringTransform(mutableString, nil, "Any-Latin; Latin-ASCII; Any-Lower" as CFString, false)
                
        // 分詞去掉空格
        let tokenizer = CFStringTokenizerCreate(nil, mutableString, CFRangeMake(0, CFStringGetLength(mutableString)), 0, CFLocaleCopyCurrent())
        var mutableTokens: [String] = []
        var type: CFStringTokenizerTokenType
        repeat {
            type = CFStringTokenizerAdvanceToNextToken(tokenizer)
            let range = CFStringTokenizerGetCurrentTokenRange(tokenizer)
            let token = CFStringCreateWithSubstring(nil, mutableString, range) as NSString
            mutableTokens.append(token as String)
        } while type != []
        //生成最終字符串
        let joined = mutableTokens.joined()
        return joined.replacingOccurrences(of: "'", with: "")
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容