2017-05-19 10 views
0

Big5でエンコードされた中国語文字でQRコードをスキャンしています。iOSのSwiftでBig5エンコーディングを使用する方法

Swift 3でこの文字列を正しく復号化する機会はありますか?

私はGitHubの上で、このObjective-C exampleを発見し、このSO questionが、スウィフトにはkCFStringEncodingBig5_HKSCS_1999kCFStringEncodingBig定数はありません。


更新:

は私が対応する迅速な変数を見つけたので、私は今、次のことを試してみました:

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) { 
    guard metadataObjects?.count ?? 0 > 0 else { 
     return 
    } 
    guard let metadata = metadataObjects.first as? AVMetadataMachineReadableCodeObject, let code = metadata.stringValue else { 
     return 
    } 
    let big5encoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.big5.rawValue))) 
    print("Big5 encoded String: " + (String(data: code.data(using: .nonLossyASCII)!, encoding: big5encoding) ?? "?")) 
} 

出力:Big5 encoded String: \326\367\322\263\270\305\277\366

私は期待に取得できますか出力Big5 encoded String: 主页概况


アップデート2:

私のQRコードは、いくつかの壊れたデータが含まれているようですので、私は新しいコードを作成し、この時間は、コンテンツは間違いなくあるBig5の文字列(Androidのアプリケーションはそれを正しく読み込み)をエンコード。私は私のiOSアプリでこのコードをスキャンすると、コンテンツは地獄はここで何が起こっているか、metadata.stringValueは日本の文字列カヌイホ

を返し傳統

あります?

+1

「UInt(CFStringEncodings.big5_HKSCS_1999.rawValue)」を試す – ColGraff

+0

実際の入力データは何ですか?文字列をデータに変換し(nonLossyASCIIを使用)、文字列に戻す(big5encodingを使用して)ようです。 –

+0

thats correct、もっと明確にするためにいくつかのコードを追加します。 – ndreisg

答えて

1

CFStringEncodings がスイフト3に列挙値として定義される:

public enum CFStringEncodings : CFIndex { 

    // ...  
    case big5 /* Big-5 (has variants) */ 
    // ...  
    case big5_HKSCS_1999 /* Big-5 with Hong Kong special char set supplement*/ 
    // ...  
} 

だから

CFStringEncodings -> CFStringEncoding -> NSStringEncoding -> String.Encoding 

例を変換する必要がありますそして

let cfEnc = CFStringEncodings.big5 
let nsEnc = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(cfEnc.rawValue)) 
let big5encoding = String.Encoding(rawValue: nsEnc) // String.Encoding 

big5encodingは、変換のために使用することができますStringおよび(NS)Data

あなたの場合、各ユニコードスカラーが のBig5エンコーディングの1バイトに対応する文字列があります。次に動作する必要があり、次の

あるいは
// let code = "\u{00D6}\u{00F7}\u{00D2}\u{00B3}\u{00B8}\u{00C5}\u{00BF}\u{00F6}" 
let bytes = code.unicodeScalars.map { UInt8(truncatingBitPattern: $0.value) } 
if let result = String(bytes: bytes, encoding: big5encoding) { 
    print(result) 
} 

、ISOラテン1エンコーディングマップ UnicodeコードポイントU + 0000という事実を使用して.. U + 00FFバイトは0x00 .. 0xFFのに:

if let data = code.data(using: .isoLatin1), 
    let result = String(data: data, encoding: big5encoding) { 
    print(result) 
} 
関連する問題