参考自原文 https://www.dazhuanlan.com/2020/03/11/5e6825c7056da/
原文参考自 https://nshipster.com/cfstringtransform/
名称按照字母排序,名称可能为数字、纯中文、纯英文、纯日文、或者各种语言的混合。
在Swift中可以使用Core Foundation下的CFStringTransform方法转换。
/// 转换字符串
/// - Parameter string: 要转的字符串,需是CFMutableString类型
/// - Parameter range: 要转换的区间。全部转换可传入 nil
/// - Parameter transform: 要应用的变换
/// - Parameter reverse: 是否要反转
public func (_ string: CFMutableString!, _ range: UnsafeMutablePointer<CFRange>!, _ transform: CFString!, _ reverse: Bool) -> Bool
extension String {
/// 将任一字符串转换为英文字母字符串
var pinyin: String {
let mutableString = NSMutableString(string: self)
// 应用 kCFStringTransformToLatin 变换将所有非英文文本转换为拉丁字母表示, 小写不带音标。
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: "")
}
}
网友评论