2017-01-01 10 views
0

Linux上でラテン文字列をswiftで英語にキャストしたいので、関数を書きましたが、いくつかのエラーがあるようです。 mac osではxcodeで動くことができますが、Linuxでは間違っています。 CFStringと文字列の変換には何か問題があると思います。 私はそれが何であるか分からない。誰か助けてくれますか?おかげLinuxでswiftを使って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

私の知る限りでは、IBMスウィフトサンドボックスにしようとしたとして、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 

いくつかの例でのみテストされています。したがって、これはあなたの問題に最適な解決策ではないかもしれません。

+0

ありがとうございます。それはうまく行くが、それは私のウェブサイトを文字化けさせるようだ。私はUTF16で文字化けしているかどうかはわかりません。あなたの意見は何ですか? – skyrealman

+0

@skyrealmanあなたが見るように、Linux上のSwiftでは、特定の状況でただ一つの関数が期待通りに機能しません。すべてのコードが問題の原因になることがあります。テスト可能なコードが表示されていなければ、私はこれ以上言い表すことはできません。 – OOPer

関連する問題