參考自原文 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: "")
}
}