我想在Linux上使用swift将一些拉丁字符串转换为英文(PinYin),所以我编写了一个函数,但它似乎有一些错误。它可以在mac os上运行xcode,但在Linux上会出错。我认为转换有问题 CFString和string之间。我不知道它是什么。有人能帮我吗?谢谢
import Foundation
#if os(Linux)
import CoreFoundation
import Glibc
#endif
public extension String{
func transformToLatinStripDiacritics() -> String{
let nsStr = NSMutableString(string: self)
let str = unsafeBitCast(nsStr, to: CFMutableString.self)
if CFStringTransform(str, nil, kCFStringTransformToLatin, false){
if CFStringTransform(str, nil, kCFStringTransformStripDiacritics, false){
let s = String(describing: unsafeBitCast(str, to: NSMutableString.self) as NSString)
return s
}
return self
}
return self
}
}
答案 0 :(得分:1)
就我在IBM Swift Sandbox上尝试而言,CFStringTransform
不适用于任意CFMutableString
。似乎它需要基于UTF-16表示的CFMutableString
。
import Foundation
#if os(Linux)
import CoreFoundation
import Glibc
#endif
public extension String {
func transformToLatinStripDiacritics() -> String{
let chars = Array(self.utf16)
let cfStr = CFStringCreateWithCharacters(nil, chars, self.utf16.count)
let str = CFStringCreateMutableCopy(nil, 0, cfStr)!
if CFStringTransform(str, nil, kCFStringTransformToLatin, false) {
if CFStringTransform(str, nil, kCFStringTransformStripDiacritics, false) {
return String(describing: str)
}
return self
}
return self
}
}
print("我在大阪住".transformToLatinStripDiacritics()) //->wo zai da ban zhu
仅针对少数示例进行了测试。因此,这可能不是您问题的最佳解决方案。