如何在Linux上使用swift在CFString和String之间进行转换

时间:2017-01-01 14:47:30

标签: linux swift

我想在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
}

}

1 个答案:

答案 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

仅针对少数示例进行了测试。因此,这可能不是您问题的最佳解决方案。