我正在扫描一个用big5编码的汉字的二维码。(下)
是否有机会在swift 3中正确解码此字符串?
我在github上发现了这个Objective-C example和这个SO question,但是swift中没有kCFStringEncodingBig5_HKSCS_1999kCFStringEncodingBig常量。
更新:
我找到了相应的swift变量,所以我现在尝试了以下操作:

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:
我的二维码似乎包含了一些损坏的数据,所以我创建了一个新的代码,这次的内容肯定是一个big5编码的字符串(android应用程序读取正确)。内容傳統
使用iOS应用程序扫描此代码时,metadata.stringvalue返回日语字符串カヌイホ
这到底是怎么回事???

最佳答案

CFStringEncodings
在SWIFT 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之间的转换。
在您的示例中,有一个字符串,其中每个unicode标量对应于
big5编码的一个字节。那么下面的方法应该有效:
// 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)
}

关于swift - 如何在iOS上的Swift中使用Big5编码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44063591/

10-10 21:09